gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:50 25 4
gpt4 key购买 nike

我想更新 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com