利用Qt的委托实现在QTableView点击单元格显示图片和文本提示

// 头文件
class MyItemDelegate :public QItemDelegate
{
public:
    MyItemDelegate(QObject * parent = 0);

    virtual ~MyItemDelegate(){}

    void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;

    bool editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index);

    void SetMainControlPoint(MainController * opMainControl);

private:

    QPixmap  * m_RadFlagPixmap;
    QPixmap * m_notRadFlagPixmap;
    MainController * m_pMainController;

};

// 源文件
MyItemDelegate::MyItemDelegate(QObject * parent) :QItemDelegate(parent), m_RadFlagPixmap(nullptr), m_notRadFlagPixmap(nullptr), m_pMainController(nullptr)
{

    QString strRadarEnv = QProcessEnvironment::systemEnvironment().value("PRESAGIS_RADAR_DIR");

    QString strImagePath = strRadarEnv + "\\samples\\src\\SampleControlBoard Me\\Resources";

    //QString strPixmapSavePath = QDir::currentPath() + "/Resources";

    m_RadFlagPixmap = new QPixmap(strImagePath + "/Flag.png");
    m_notRadFlagPixmap = new QPixmap(strImagePath + "/NoFlag.png");
}

void MyItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
    // 时时刻刻都在绘制红旗或者没有红旗 根据选中的是否选中
    if (index.column() != 0)
    {
        QItemDelegate::paint(painter, option, index);
        return;
    }

    //const int & row = index.row(); // 当前索引行 1-你目前的所有列表中的行号
    //const int & col = index.column(); //永远是0 因为上边不是0的都返回了

    const QAbstractItemModel * model = index.model();
    QVariant var = model->data(index, Qt::CheckStateRole); //这个是下边判读当前模块是否被点击
    if (var.isNull()) var = false;

    std::set<string> & mSaveMonitorTargetIdSet = m_pMainController->GetMainWindow()->GetSaveMonitorTargetIDSet();

    if (var.toBool()) //红旗
    {

        QString str = m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelViewModel().item(index.row(), 1)->text();
        mSaveMonitorTargetIdSet.insert(str.toStdString());
    }
    else //没旗
    {
        mSaveMonitorTargetIdSet.erase(m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelViewModel().item(index.row(), 1)->text().toStdString());
    }

    const QPixmap & star = var.toBool() ? * m_RadFlagPixmap : * m_notRadFlagPixmap; //点击就画红旗 

    int width = star.width();
    int height = star.height();
    QRect rect = option.rect;
    int x = rect.x() + rect.width() / 2 - width / 2;
    int y = rect.y() + rect.height() / 2 - height / 2;

    painter->drawPixmap(x, y, star); //绘制
}

bool MyItemDelegate::editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & /*option*/, const QModelIndex & index)
{

    if (index.column() == 0 && index.row() != -1)
        m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelView()->setCursor(Qt::PointingHandCursor);
    else
        m_pMainController->GetMainWindow()->GetRadarEntityInfoTabelView()->setCursor(Qt::ArrowCursor);
    
    
    QToolTip::showText(QCursor::pos(), strShowText); //点击提示
    
        if (event->type() == QEvent::MouseButtonPress && index.column() == 0) //当前列等于0
    {
        //const int & row = index.row(); // 当前索引行
        //const int & col = index.column(); //

        QVariant var = model->data(index, Qt::CheckStateRole);
        bool isFavourite = var.toBool(); // 判断是否被点击
        if (var.isValid())
        {
            isFavourite = isFavourite ? false : true;
        }
        else
        {
            isFavourite = true;
        }

        model->setData(index, isFavourite, Qt::CheckStateRole); //这块只是设置当前单元格是否被点击 然后在paint函数根据按钮是否选中来绘制红旗
        return true;

    }

    return false;
}

 

posted @ 2020-04-25 13:48  骄傲到自负  阅读(1407)  评论(0)    收藏  举报