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 在鼠标悬停时显示表格项的内容的主要内容,如果未能解决你的问题,请参考以下文章

display属性 鼠标悬停时显示隐藏内容,

Ext JS 网格面板:如何在鼠标悬停时显示内容

在鼠标悬停时显示数据

如何仅在鼠标悬停时显示文本

在鼠标悬停时显示绘图值。 - 检测散点

SVG 矩形在鼠标悬停时显示 HTML 标题