首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QTableView在鼠标悬停时显示表项的内容

QTableView在鼠标悬停时显示表项的内容
EN

Stack Overflow用户
提问于 2017-09-26 16:23:31
回答 2查看 5.3K关注 0票数 4

用手机写作,所以格式可能很糟糕。

我有一个带有QTableView的表,表中有两列。第二列包含一个很长的字符串,如果不调整大小,就无法完全显示。当我将鼠标悬停在一个项目上,而矩形靠近鼠标时,我想在矩形中显示字符串(许多像Eclipse和VS这样的软件都有这样的功能)。

我在互联网上搜索了一段时间,但仍然不知道如何编写这个视图功能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-26 20:05:02

首先,要实现弹出窗口,您需要知道鼠标何时进入表中项的区域,为此,我们将使用eventFilter()方法,查找何时使用QEvent::MouseMove事件,并通过函数indexAt()和鼠标的位置获得索引,并比较这与前一个索引是否不同。如果发生这种情况,它将根据需要显示或隐藏弹出窗口。

要创建PopUp,我们使用一个对话框并插入一个QLabel,并使用setWordWrap属性来正确地匹配文本

代码语言:javascript
运行
复制
#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

截图:

在下面的链接中,您将找到一个示例

票数 6
EN

Stack Overflow用户

发布于 2018-11-07 23:37:35

见鬼。每个人都必须努力做到这一点,并开始对不需要的东西进行子类化和改造。答案已经在在PyQT中显示QTreeView项的工具提示里了

答案是,在yer模型的data()函数中,在第一次检查'index.column()‘以确保它是正确的列之后,在调用’Qt::ToolTipRole‘之后返回一些有用的内容。

下面是一些类似的愚蠢:

显示自定义模型的长条目的工具提示

我会给他们一个怀疑的好处,并假设Qt过去是这样工作的,但现在并非如此。他们让人们制作这个自定义事件过滤器;而我则为我的模型中的给定列返回了ToolTipRole的工具提示,而工具提示仅显示在返回值的列中的单元格中。这只是不必要的工作,现在不需要,而且浪费时间。这个wiki条目很可能是过时的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46431491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档