2010-04-23 67 views
2

我在pyqt應用程序中有一個QTreeView的自定義子類。我試圖讓用戶能夠突出顯示和「低光照」(缺乏更好的術語)行。突出顯示的行應具有粗體文本和(可選)不同的背景顏色。有任何想法嗎?
我正在考慮StyleSheets作爲一個選項,但到目前爲止一直無法讓它工作。如果我設置了QTreeView則的樣式表:在QTreeView中設置粗體行

self.setStyleSheet("QTreeView::item:selected {border: 1px solid #567dbc;}") 

我無法弄清楚如何手動啓用「狀態」,將只保留所需的排在一個特定的狀態。如果我嘗試設置單個項目的樣式表:

#modelIndex is a valid QModelIndex 
modelIndex.internalPointer().setStyleSheet() 

我收到段錯誤。
我不相信樣式表是要走的路,我願意接受所有想法。謝謝!

+0

無關的最終修復,但我周圍的段錯誤了。我忘記了由qsortfilterproxy返回的內部指針需要轉換爲模型指針。因此: self.model()。sourceModel()。getItem(self.mapToSource(each)) – taynaron 2010-04-27 22:20:01

+0

我決定爲每個項目添加一個QFont變量以跟蹤項目的狀態,然後使用委託繪製所有項目與自定義QFont。謝謝大家! – taynaron 2010-04-27 22:50:15

回答

5

從你所說的話看來,最簡單的解決方案將是爲你的treeview定義一個custom item delegate,並在需要時將項目字體粗細設置爲粗體。請檢查下面的示例是否適合您,它應該創建一個帶有自定義項目委託的樹視圖,這將改變項目的字體樣式。

import sys 
from PyQt4 import QtGui, QtCore 

class BoldDelegate(QtGui.QStyledItemDelegate): 
    def paint(self, painter, option, index): 
     # decide here if item should be bold and set font weight to bold if needed 
     option.font.setWeight(QtGui.QFont.Bold) 
     QtGui.QStyledItemDelegate.paint(self, painter, option, index) 


class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     model = QtGui.QStandardItemModel() 

     for k in range(0, 4): 
      parentItem = model.invisibleRootItem() 
      for i in range(0, 4): 
       item = QtGui.QStandardItem(QtCore.QString("item %0 %1").arg(k).arg(i)) 
       parentItem.appendRow(item) 
       parentItem = item 

     self.view = QtGui.QTreeView() 
     self.view.setModel(model) 
     self.view.setItemDelegate(BoldDelegate(self)) 

     self.setCentralWidget(self.view) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainForm() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 

希望這會有所幫助,至於

+0

另外一個是我曾經理解的自定義委託的第一個示例。通常有太多的花裏胡哨的東西我不知道發生了什麼。 – neuronet 2014-12-09 17:34:05

3

我可以想到一些方法來做到這一點。如果您有權訪問模型,最簡單的方法是添加模型中索引的狀態跟蹤,並返回data()函數中請求的角色的適當選項。這樣做的缺點是,如果您在不同的視圖中使用相同的模型,並希望將高光局部保留在一個視圖中。

第二個最簡單的可能是製作一個代理模型,它跟蹤數據本身,並從原始模型中獲取所有其他數據。在這種情況下(不改變原始模型的行或列),這可能會很容易。

最難的是製作一個自定義委託,以跟蹤哪些行/列應該高亮顯示,並根據所繪製的模型索引的行/列自行繪製。你將不得不保持對委託的訪問,以便你可以告訴它哪些行和列需要設置。您還需要處理模型更改時發生的情況。

+0

我希望所有視圖都能看到狀態,但模型會在後臺定期更新,所以我想我會爲項目本身添加一些狀態。 但是,一旦我設置了狀態變量並且可以訪問,我仍然不確定如何實際將項目顯示爲粗體。 – taynaron 2010-04-23 23:18:07

+1

@taynaron:模型的數據函數爲要返回的數據的角色提供一個參數。賠率是你只看着DisplayRole,並返回要繪製的數據。但是,還有一個FontRole可用於返回用於呈現項目的字體(因此爲粗體),以及可用於更改用於繪製這些項目的顏色的BackgroundColorRole和TextColorRole。這是前兩個(模型)選項。委託選項有一個繪製方法,您必須重寫並繪製粗體文本。 – 2010-04-24 14:58:56

相關問題