2010-04-23 5 views
2

pyqt 응용 프로그램에 QTreeView의 사용자 지정 하위 클래스가 있습니다. 사용자에게 강조 표시하고 더 낮은 용어에 대해 "로우 라이트"기능을 부여하려고합니다. 강조 표시된 행은 굵은 텍스트와 (선택적으로) 다른 배경색을 가져야합니다. 어떤 아이디어?
나는 옵션으로 StyleSheets을 고려하고 있지만 지금까지는 작동하지 못했습니다. 나는 QTreeView의 스타일 시트 설정 한 경우 :QTreeView에서 굵은 줄 설정

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

을 나는 수동으로 특정 상태에서만 원하는 행을 유지할 것 '상태'를 사용하도록 설정하는 방법을 알아낼 수 없습니다. 개별 항목의 스타일 시트를 설정하려고하면 :

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

나는 segfault를 얻습니다.
저는 스타일 시트가 갈 길이 멀다고 확신하지는 않습니다. 모든 아이디어에 열려 있습니다. 감사!

+0

과 관련,하지만 난 segfault의 주위를 얻었다. qsortfilterproxy가 반환 한 내부 포인터가 모델 포인터로 변환되어야한다는 점을 잊어 버렸습니다. 그러므로self.model(). sourceModel(). getItem (self.mapToSource (each)) – taynaron

+0

QFont 변수를 각 항목에 추가하여 항목의 상태를 추적하고 대리인을 사용하여 모든 항목을 페인팅하도록 정산했습니다. 사용자 정의 QFont. 모두에게 감사드립니다! – taynaron

답변

5

당신이 말한 것 중 가장 쉬운 해결책은 treeview에 대해 custom item delegate을 정의하고 필요할 때마다 항목 글꼴 두께를 굵게 설정하는 것입니다. Pls, 아래 예제가 작동하는지 확인하십시오. 항목의 글꼴 스타일을 변경할 사용자 정의 항목 위임이있는 트리보기를 작성해야합니다. 이 도움이

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

3

나는 이것을 수행하는 몇 가지 방법을 생각할 수 있습니다. 가장 쉬운 방법은 모델에 액세스 할 수있는 경우 모델의 인덱스 상태 추적을 추가하고 data() 함수에서 요청한 역할에 적합한 옵션을 반환하는 것입니다. 단점은 다른 뷰에서 동일한 모델을 사용하고 하이라이트를 하나의 뷰에 로컬로 유지하려는 경우입니다.

두 번째로 가장 쉬운 방법은 프록시 모델을 만드는 것입니다. 프록시 모델은 데이터 자체를 추적하고 원래 모델의 다른 모든 데이터를 가져옵니다. 이 경우 (원래 모델의 행이나 열을 변경하지 않는 경우) 매우 쉽습니다.

어떤 행/열을 강조 표시해야하는지 추적하는 사용자 지정 대리자를 만드는 것이 가장 힘들며 드로잉하는 모델 인덱스의 행/열을 기반으로 다르게 그립니다. 델리게이트에 대한 액세스 권한을 유지해야만 행과 열의 설정이 필요하다는 것을 알 수 있습니다. 또한 모델이 변경 될 때 어떤 일이 일어나는지 처리해야합니다.

+0

모든 뷰에서 상태를 볼 수 있도록하고 싶지만 모델이 백그라운드에서 정기적으로 업데이트되므로 아이템에 상태를 추가하고 싶을 것입니다. 일단 상태 변수를 설정하고 액세스 할 수있게되면 실제로 항목을 굵게 표시하는 방법을 아직 확신 할 수 없습니다. – taynaron

+1

@taynaron : 모델의 데이터 함수는 반환 할 데이터의 역할에 대한 매개 변수를 사용합니다. 당신은 단지 DisplayRole을보고, 그리고 그려 질 데이터를 리턴 할 것입니다. 그러나 항목을 렌더링하는 데 사용되는 글꼴 (따라서 굵은 글꼴)을 반환하는 데 사용할 수있는 FontRole과 해당 항목을 그리는 데 사용 된 색상을 변경하는 데 사용할 수있는 BackgroundColorRole 및 TextColorRole도 있습니다. 이것은 처음 두 가지 (모델) 옵션을위한 것입니다. 위임 옵션에는 굵은 텍스트를 재정의하고 그릴 필요가있는 페인트 메서드가 있습니다. –

관련 문제