2015-06-02 36 views
0

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

工具提示的数据应从字典data_for_tree中的“注释”键的值中获取。

#!/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_()) 

回答

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) 

在这里,我设置的工具提示是该行中的每一个细胞(姓名,金额和票据)相同的,但你可以很容易地改变这有一个单元格的不同工具提示(希望这很明显,该怎么做)

+0

谢谢。当然,我在stackoverflow寻找解决方案,我发现了一个setTooltip方法,但我问一个问题的原因是我试图将该方法应用于'item'。在我的例子中'item'是一个元组,所以有错误信息。谢谢你的解释。 –

+0

@SergiiArtele啊,我明白了!好吧,很高兴我能帮上忙! –