c++ - 更新模型/ View 场景中 QXXXView 元素(QTableView、QTreeView 等)的显示工具提示

标签 c++ qt qt5

我想更新 model/view scenario 的 View 小部件的事件 工具提示.工具提示是通过使用 Qt::ToolTipRole 角色调用模型的 data 来确定的。

但是,由于数据更改,我找不到任何更新显示/事件 工具提示的解决方案。例如,场景是一些基于时间的工具提示或在加载图像时带有预览的图像工具提示。

我花了一些时间研究解决方案,我想分享上述问题的可能答案。

编辑: 单独使用 Qt::ToolTipRole 发出 dataChanged 似乎不会更新事件工具提示,这是我的 QTableViewModel 模型的最小示例(使用 Qt5 测试):

class MyModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    MyModel(QObject *parent = 0) : QAbstractTableModel(parent), i(0) {
        QTimer * timer = new QTimer(this);
        timer->setInterval(500);
        connect(timer, &QTimer::timeout, this, &MyModel::onNewTime);
        timer->start();
    }
    int rowCount(const QModelIndex &) const { return 1; }
    int columnCount(const QModelIndex &) const { return 1; }
    QVariant data(const QModelIndex &, int role) const {
        switch(role){
        case Qt::DisplayRole:
            return "Hund";
        case Qt::ToolTipRole:
            return i;
        default:
            return QVariant();
        }
    }
private slots:
    void onNewTime() {
        i+=1;
        QModelIndex model = index(0,0);
        emit dataChanged(model, model, QVector<int>()<<Qt::ToolTipRole);
    }
private:
    int i;
};

最佳答案

子类化的第一个想法,例如,QTableView 失败了,因为 eventFilter(...) event(...) helpEvent(...) 也不会通过 QEvent::ToolTip 事件调用。

我最终重新实现了 viewportEvent(...) 以捕获 QEvent::ToolTip 事件。此外,我还必须确保工具提示弹出窗口不会在鼠标移动后更新。

这是我的解决方案。它基本上会关闭并重新打开有关数据更改的工具提示。要在运行时更新工具提示,只需调用或连接到插槽 showOrUpdateToolTip。首先是QTableView的子类化:

class TableViewToolTipModifier : public QTableView
{
    Q_OBJECT
public:
    TableViewToolTipModifier(QWidget *parent=0);
public slots:
    void showOrUpdateToolTip();
protected:
    bool viewportEvent(QEvent *event);
    void mouseMoveEvent(QMouseEvent *);
private:
    QPoint _lastPosition;
    bool _isActive = false;
};

实现:

TableViewToolTipModifier::TableViewToolTipModifier(QWidget* parent)
    : QTableView(parent)
{
    this->setMouseTracking(true);
}

void TableViewToolTipModifier::showOrUpdateToolTip()
{
    if (QTableView::underMouse() && _isActive)
    {
        const QModelIndex index = QTableView::indexAt(
                                       this->mapFromGlobal(_lastPosition));
        if (index.isValid())
        {
            const QString toolTip = index.data(Qt::ToolTipRole).toString();
            QToolTip::showText(_lastPosition, toolTip, this, QRect());
        }
    }
}

void TableViewToolTipModifier::mouseMoveEvent(QMouseEvent * event)
{
    _isActive = false;
     QToolTip::hideText();

     QTableView::mouseMoveEvent(event);
}

bool TableViewToolTipModifier::viewportEvent(QEvent *event)
{
    if (event->type() == QEvent::ToolTip)
    {
        _lastPosition = static_cast<QHelpEvent*>(event)->globalPos();
        _isActive = true;
        showOrUpdateToolTip();
        return true;
    }
    return QTableView::viewportEvent(event);
}

关于c++ - 更新模型/ View 场景中 QXXXView 元素(QTableView、QTreeView 等)的显示工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42977793/

相关文章:

c++ - Qt MouseMove 事件未在 eventFilter() 中被捕获

c++ - QMessageBox消失

c++ - 在C/C++编程中,从较小的地址减去较大的地址时,输出指示什么?

qt - "Bind"两个 QML CheckBox 在一起,确保它们的状态始终相同

c++ - 二进制文件格式与基于文本的格式文件大小

ubuntu - Qt creator Debug模式无法在Ubuntu20上运行

c++ - QML 引用错误 - <thing> 在 c++/QML 集成期间未定义

c++ - 重载赋值运算符还是使用默认运算符?

C++ 在给定位置寻找一个 std::string::iterator

c++ - Boost.Python dll 在编译时被跳过