QTableView 在鼠标悬停时显示 table 项的内容
QTableView to show the content of table item when mouse hover
用phone写入,格式可能不对
我有一个 table 和 QTableView
,table 中有两列。第二列包含一个很长的字符串,如果不调整大小就无法完全显示。当我将鼠标悬停在一个项目上时,我想将字符串显示在一个矩形中,并且该矩形在鼠标附近(许多软件如Eclipse 和VS 都有此功能)。
我在网上搜索了一段时间,但仍然不知道如何编写此视图功能。
首先要实现弹出窗口,您需要知道鼠标何时进入 table 中某个项目的区域,为此我们将使用 eventFilter()
方法并查找何时 QEvent::MouseMove
事件,我们会通过函数indexAt()
和鼠标的位置获取索引,比较是否和之前的索引不同。如果发生这种情况,它会根据需要显示或隐藏弹出窗口。
为了创建弹出窗口,我们使用对话框并插入 QLabel,并使用 setWordWrap 属性 以正确适应文本
#ifndef TABLEVIEW_H
#define TABLEVIEW_H
#include <QDialog>
#include <QEvent>
#include <QLabel>
#include <QMouseEvent>
#include <QTableView>
#include <QVBoxLayout>
#include <QHeaderView>
class TableView: public QTableView{
Q_OBJECT
QDialog *popup;
QLabel *popupLabel;
public:
TableView(QWidget *parent = Q_NULLPTR):QTableView(parent){
viewport()->installEventFilter(this);
setMouseTracking(true);
popup = new QDialog(this, Qt::Popup | Qt::ToolTip);
QVBoxLayout *layout = new QVBoxLayout;
popupLabel = new QLabel(popup);
popupLabel->setWordWrap(true);
layout->addWidget(popupLabel);
popupLabel->setTextFormat(Qt::RichText);
//popupLabel->setOpenExternalLinks(true);
popup->setLayout(layout);
popup->installEventFilter(this);
}
bool eventFilter(QObject *watched, QEvent *event){
if(viewport() == watched){
if(event->type() == QEvent::MouseMove){
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QModelIndex index = indexAt(mouseEvent->pos());
if(index.isValid()){
showPopup(index);
}
else{
popup->hide();
}
}
else if(event->type() == QEvent::Leave){
popup->hide();
}
}
else if(popup == watched){
if(event->type() == QEvent::Leave){
popup->hide();
}
}
return QTableView::eventFilter(watched, event);
}
private:
void showPopup (const QModelIndex &index) const {
if(index.column() == 1){
QRect r = visualRect(index);
popup->move(viewport()->mapToGlobal(r.bottomLeft()));
popup->setFixedSize(100, popup->heightForWidth(100));
popupLabel->setText(index.data(Qt::DisplayRole).toString());
popup->adjustSize();
popup->show();
}
else {
popup->hide();
}
}
};
#endif // TABLEVIEW_H
截图:
在下面link你会发现一个example.
该死的。每个人都必须尝试以艰难的方式去做,并开始子类化东西并重新发明不需要它的东西。答案已经在Displaying tooltips in PyQT for a QTreeView item
答案是,在您的模型的 data() 函数中,只有 return 在调用 'Qt::ToolTipRole;' 后首先检查 'index.column()' 以确保它是右栏。
这里有一些类似的愚蠢行为:
Show tooltips for long entries of your custom model
我会给他们一个疑问,并假设 Qt 曾经以这种方式工作;但现在没有。他们有人制作这个自定义事件过滤器;而我 return 为我的模型中给定列的 ToolTipRole 编辑了一个工具提示,并且工具提示只出现在值被 return 编辑的列中的单元格中。这完全是不必要的工作;现在不需要;它浪费时间。此 wiki 条目很有可能,只是过时了。
用phone写入,格式可能不对
我有一个 table 和 QTableView
,table 中有两列。第二列包含一个很长的字符串,如果不调整大小就无法完全显示。当我将鼠标悬停在一个项目上时,我想将字符串显示在一个矩形中,并且该矩形在鼠标附近(许多软件如Eclipse 和VS 都有此功能)。
我在网上搜索了一段时间,但仍然不知道如何编写此视图功能。
首先要实现弹出窗口,您需要知道鼠标何时进入 table 中某个项目的区域,为此我们将使用 eventFilter()
方法并查找何时 QEvent::MouseMove
事件,我们会通过函数indexAt()
和鼠标的位置获取索引,比较是否和之前的索引不同。如果发生这种情况,它会根据需要显示或隐藏弹出窗口。
为了创建弹出窗口,我们使用对话框并插入 QLabel,并使用 setWordWrap 属性 以正确适应文本
#ifndef TABLEVIEW_H
#define TABLEVIEW_H
#include <QDialog>
#include <QEvent>
#include <QLabel>
#include <QMouseEvent>
#include <QTableView>
#include <QVBoxLayout>
#include <QHeaderView>
class TableView: public QTableView{
Q_OBJECT
QDialog *popup;
QLabel *popupLabel;
public:
TableView(QWidget *parent = Q_NULLPTR):QTableView(parent){
viewport()->installEventFilter(this);
setMouseTracking(true);
popup = new QDialog(this, Qt::Popup | Qt::ToolTip);
QVBoxLayout *layout = new QVBoxLayout;
popupLabel = new QLabel(popup);
popupLabel->setWordWrap(true);
layout->addWidget(popupLabel);
popupLabel->setTextFormat(Qt::RichText);
//popupLabel->setOpenExternalLinks(true);
popup->setLayout(layout);
popup->installEventFilter(this);
}
bool eventFilter(QObject *watched, QEvent *event){
if(viewport() == watched){
if(event->type() == QEvent::MouseMove){
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QModelIndex index = indexAt(mouseEvent->pos());
if(index.isValid()){
showPopup(index);
}
else{
popup->hide();
}
}
else if(event->type() == QEvent::Leave){
popup->hide();
}
}
else if(popup == watched){
if(event->type() == QEvent::Leave){
popup->hide();
}
}
return QTableView::eventFilter(watched, event);
}
private:
void showPopup (const QModelIndex &index) const {
if(index.column() == 1){
QRect r = visualRect(index);
popup->move(viewport()->mapToGlobal(r.bottomLeft()));
popup->setFixedSize(100, popup->heightForWidth(100));
popupLabel->setText(index.data(Qt::DisplayRole).toString());
popup->adjustSize();
popup->show();
}
else {
popup->hide();
}
}
};
#endif // TABLEVIEW_H
截图:
在下面link你会发现一个example.
该死的。每个人都必须尝试以艰难的方式去做,并开始子类化东西并重新发明不需要它的东西。答案已经在Displaying tooltips in PyQT for a QTreeView item
答案是,在您的模型的 data() 函数中,只有 return 在调用 'Qt::ToolTipRole;' 后首先检查 'index.column()' 以确保它是右栏。
这里有一些类似的愚蠢行为:
Show tooltips for long entries of your custom model
我会给他们一个疑问,并假设 Qt 曾经以这种方式工作;但现在没有。他们有人制作这个自定义事件过滤器;而我 return 为我的模型中给定列的 ToolTipRole 编辑了一个工具提示,并且工具提示只出现在值被 return 编辑的列中的单元格中。这完全是不必要的工作;现在不需要;它浪费时间。此 wiki 条目很有可能,只是过时了。