QTableView 在鼠标悬停时显示表格项的内容
Posted
技术标签:
【中文标题】QTableView 在鼠标悬停时显示表格项的内容【英文标题】:QTableView to show the content of table item when mouse hover 【发布时间】:2017-09-26 16:23:31 【问题描述】:用手机写,格式可能不好。
我有一个带有QTableView
的表,表中有两列。第二列包含一个很长的字符串,如果不调整大小就无法完全显示。当我将鼠标悬停在一个项目上时,我想在一个矩形中显示字符串,并且该矩形靠近鼠标(Eclipse和VS等许多软件都有这样的功能)。
我已经在互联网上搜索了一段时间,但仍然不知道如何编程此视图功能。
【问题讨论】:
使用:tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
:P
看看这个。发现bar的长度只有1,正在寻找改变长度的方法,然后看这个~ :)
我在这张桌子上遇到了一个新问题,我绞尽脑汁但还是没弄明白。 ***.com/questions/46848612/…。如果你有空闲时间,我希望你能帮助我。我没有找到***的邀请别人回答问题的功能,所以我在这里回复你。
【参考方案1】:
该死的。每个人都必须努力做到这一点,并开始继承一些东西并重新发明不需要它的东西。答案已经在Displaying tooltips in PyQT for a QTreeView item
答案是,在你的模型的 data() 函数中,当调用 'Qt::ToolTipRole;' 时返回一些有用的东西在首先检查“index.column()”以确保它是正确的列之后。
这里有一些类似的愚蠢:
Show tooltips for long entries of your custom model
我会给他们一个怀疑的好处,并假设 Qt 曾经以这种方式工作;但现在没有。他们有人制作这个自定义事件过滤器;而我为我的模型中的给定列返回了 ToolTipRole 的工具提示,并且工具提示仅显示在为其返回值的列中的单元格。这简直是不必要的工作;现在不需要了;这会浪费时间。这个 wiki 条目很可能只是过时了。
【讨论】:
这应该是公认的答案。【参考方案2】:首先要实现弹出,您需要知道鼠标何时进入表格中某个项目的区域,为此我们将使用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
截图:
在以下链接中,您将找到example。
【讨论】:
评论不用于扩展讨论或冗长的调试会话;这个对话是moved to chat。如果需要添加更多信息,应将其编辑到问题或答案中(如果适用)。 还没有。滚动条未显示在我的项目中。在您的链接项目中,滚动条显示但效果不佳。此外,弹出窗口仍然没有显示多行。好消息是弹出窗口正确消失。 我突然意识到你可能误解了滚动条。我希望我可以拖动滚动显示我的第二列的全部内容。如图所示,您的滚动条并未显示第二列的所有内容。 我尝试绘制图像但失败了,我用 gvim 屏幕截图显示它。我不清楚你的意思是“speating the word”,但我认为你可以任意分开它。 查询只是一个行号(地址),不需要破折号以上是关于QTableView 在鼠标悬停时显示表格项的内容的主要内容,如果未能解决你的问题,请参考以下文章