- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想更新 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/
我想更新 model/view scenario 的 View 小部件的事件 工具提示.工具提示是通过使用 Qt::ToolTipRole 角色调用模型的 data 来确定的。 但是,由于数据更改,我
我是一名优秀的程序员,十分优秀!