【问题标题】:PyQt ToolTip for QTreeViewQTreeView 的 PyQt 工具提示
【发布时间】:2015-06-03 12:44:31
【问题描述】:

请解释如何为 QTreeView 中的每个项目启用和显示工具提示。我找到了代码示例class TreeModel(QAbstractItemModel),但由于我的初学者水平,我无法理解如何将其应用于我的需求。

工具提示的数据应取自字典 data_for_tree 中键“note”的值。

#!/usr/bin/env python -tt
# -*- coding: utf-8 -*-

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

import sys
reload(sys)
sys.setdefaultencoding('utf8')

data_for_tree = {"tomato":{"color":"red","ammount":"10", "note":"a note for tomato"},"banana":{"color":"yellow","ammount":"1", "note":"b note for banana"}, "some fruit":{"color":"unknown","ammount":"100", "note":"some text"}}

class TreeModel(QAbstractItemModel):

    def data(self, index, role=Qt.DisplayRole):
        #...
        if role == Qt.ToolTipRole:
            return 'ToolTip'

    def flags(self, index):
        if not index.isValid():
            return Qt.NoItemFlags # 0
        return Qt.ItemIsSelectable # or Qt.ItemIsEnabled            

class ProxyModel(QSortFilterProxyModel):

    def __init__(self, parent=None):
        super(ProxyModel, self).__init__(parent)

    def lessThan(self, left, right):
        leftData = self.sourceModel().data(left)
        rightData = self.sourceModel().data(right)
        try:
            return float(leftData) < float(rightData)
        except ValueError:
            return leftData < rightData

class MainFrame(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.MyTreeView = QTreeView()
        self.MyTreeViewModel = QStandardItemModel()
        self.MyTreeView.setModel(self.MyTreeViewModel)
        self.most_used_cat_header = ['Name', "ammount", "color"]
        self.MyTreeViewModel.setHorizontalHeaderLabels(self.most_used_cat_header)
        self.MyTreeView.setSortingEnabled(True)
        self.MyTreeView_Fill()

        MainWindow = QHBoxLayout(self)    
        MainWindow.addWidget(self.MyTreeView)
        self.setLayout(MainWindow)

    def MyTreeView_Fill(self):
        for k in data_for_tree:
            name = QStandardItem(k)
            ammount = QStandardItem(data_for_tree[k]["ammount"])
            note = QStandardItem(data_for_tree[k]["color"])
            tooltip = data_for_tree[k]["note"]
            item = (name, ammount, note)
            self.MyTreeViewModel.appendRow(item)
        self.MyTreeView.sortByColumn(1, Qt.DescendingOrder)
        proxyModel = ProxyModel(self)
        proxyModel.setSourceModel(self.MyTreeViewModel)
        self.MyTreeView.setModel(proxyModel)

        c = 0
        while c < len(self.most_used_cat_header):
            self.MyTreeView.resizeColumnToContents(c)
            c=c+1

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainFrame()
    main.show()
    main.move(app.desktop().screen().rect().center() - main.rect().center())
sys.exit(app.exec_())

【问题讨论】:

    标签: pyqt tooltip qtreeview


    【解决方案1】:

    当您使用 QStandardItemQStandardItemModel 类(这是我推荐的!)时,您无需为找到的 TreeModel 类而烦恼。很少需要创建自己的模型,但出于某种原因,教程经常鼓励您这样做。如果你发现一些鼓励你继承QAbstractItemModel 的东西,我建议你先检查堆栈溢出,看看是否有更简单的方法来做到这一点!在这种情况下,有一种非常简单的方法可以添加您的工具提示。

    如果您查看 C++ 文档(我经常发现它比 PyQt 文档更有用,可以找出可用的方法),您会看到 QStandardItem 有一个名为 setToolTip() 的方法。

    因此,您需要做的就是在添加到模型的每个项目上调用此方法。比如MyTreeView_Fill方法的循环内部:

    name = QStandardItem(k)
    ammount = QStandardItem(data_for_tree[k]["ammount"])
    note = QStandardItem(data_for_tree[k]["color"])
    tooltip = data_for_tree[k]["note"]
    name.setToolTip(tooltip)
    ammount.setToolTip(tooltip)
    note.setToolTip(tooltip)
    

    在这里,我已将行中的每个单元格(名称、数量和注释)的工具提示设置为相同,但您可以轻松地将其更改为其中一个单元格具有不同的工具提示(希望很明显如何这样做)

    【讨论】:

    • 谢谢。当然,我在 stackoverflow 中寻找解决方案并找到了 setTooltip 方法,但我提出问题的原因是我试图将该方法应用于item。在我的情况下,item 是一个元组,所以有错误消息。谢谢你的解释。
    • @SergiiArtele 啊,我明白了!好吧,很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多