前言:
现在有一个需求,就是在Qt 表格界面中,鼠标悬停在某行某列的单元格上,能够显示单元格内容的全部信息(tip)
先设置鼠标追踪如下:
QTableView m_tableView = new QTableView(this);
m_tableView->setMouseTracking(true); // 设置鼠标追踪
connect(m_tableView, &DTableView::entered, this, &SecurityLogDialog::doMouseTrackTip)
槽方法:
void SecurityLogDialog::doMouseTrackTip(QModelIndex index)
{
QToolTip::showText(QCursor::pos(), index.data().toString());
}
(1)QModelIndex类 用于定位数据模型中的数据。
Header: #include "QModelIndex"
qmake: QT+=core
此类用作从QAbstractItemModel派生的项模型的索引。 项目视图,代理和选择模型使用索引来定位模型中的项目。
新的QModelIndex对象是用QAbstractItemModel::createIndex()来生成,一个无效的索引能用QModelIndex构造,这类无效的索引经常被用于更高层次的父类索引
在model里面的Modelindexes,包含了所有需要确认它位置的信息。我们可以用row(),column(),parent()去获取它的行、列、和parent信息
Model index在生成之后要立即使用,他会在使用之后被discarded,如果想要一直使用某个Model Index,可以考虑使用QPersistentModelIndex
相关参考:
链接1.https://blog.csdn.net/zhouzhouasishuijiao/article/details/84331268
链接2.https://www.jianshu.com/p/f79a2feca5a1 (Python)
(2)控件的toolTip 设置提示悬浮
调用setToolTip()为控件设置toolTip
void setToolTip(const QString &)
// 例如:
QPushButton *show =new QPushButton();
show->setToolTip("Hello Word")
如图所示:
相关参考:
链接1:https://blog.csdn.net/qq_41453285/article/details/100035965
(3)setMouseTracking(true) 对鼠标进行监控
目的:
1、要想实现mouseMoveEvent,则需要在构造函数中添加setMouseTrack(true),直接得到监听事件。若是setMouseTrack(false),只有鼠标按下才会有mouseMove监听事件响应。
2、使用setMouseTracking(true)对鼠标进行监控(mouseMoveEvent(QMouseEvent *event)),如果WidgetA有个子窗体WidgetB会占据WidgetA的绝大部分空间,那么当鼠标移动到WidgetB上时,WidgetA就会失去对鼠标的监控。
3、使用setAttribute (Qt::WA_Hover,true)
也可以实现对鼠标的监控,相对于setMouseTracking(true)
来说,它可以弥补鼠标事件被子窗体获取的问题(这个还没验证):
bool Widget::event(QEvent *e)
{
if (e->type() == QEvent::HoverEnter || e->type() == QEvent::HoverLeave
|| e->type() == QEvent::HoverMove)
{
QHoverEvent* pHoverEvent = static_cast(e);
setMouseStatus(pHoverEvent->pos());
}
return QWidget::event(e);
}
相关参考:
链接1:https://blog.csdn.net/hebbely/article/details/52188904