2016-11-21 25 views
0

私はタブとツリービューを持つためにこのコードを持っています。 ツリービューの各行に小さなボタンがいくつかあることをお勧めします。 ツリービューの行にどのようにボタンを追加できますか?QTreeViewの行にボタンを追加するには

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class tabdemo(QTabWidget): 
    def __init__(self, parent=None): 
     super(tabdemo, self).__init__(parent) 
     self.setGeometry(300, 300, 500, 300) 
     self.tab1 = QWidget() 
     self.tab2 = QWidget() 
     self.tab3 = QWidget() 


     self.addTab(self.tab1, "Tab 1") 
     self.addTab(self.tab2, "Tab 2") 
     self.addTab(self.tab3, "Tab 3") 
     self.tab1UI() 
     self.tab2UI() 
     self.tab3UI() 
     self.setWindowTitle("tab demo") 

    def tab3UI(self): 
     layout = QFormLayout() 
     layout.addRow("Name", QLineEdit()) 
     layout.addRow("Address", QLineEdit()) 
     self.setTabText(0, "Contact Details") 
     self.tab3.setLayout(layout) 

    def tab2UI(self): 
     layout = QFormLayout() 
     sex = QHBoxLayout() 
     sex.addWidget(QRadioButton("Male")) 
     sex.addWidget(QRadioButton("Female")) 
     layout.addRow(QLabel("Sex"), sex) 
     layout.addRow("Date of Birth", QLineEdit()) 
     self.setTabText(1, "Personal Details") 
     #self.button.clicked.connect(self.handleButton) 
     self.tab2.setLayout(layout) 



    def tab1UI(self): 
     layout = QGridLayout() 
     layout.addWidget(QLabel("subjects"), 0, 0) 
     layout.addWidget(QCheckBox("Physics"), 0, 1) 
     layout.addWidget(QCheckBox("Maths"), 0, 2) 

     view = QTreeView() 
     view.setSelectionBehavior(QAbstractItemView.SelectRows) 
     model = QStandardItemModel() 
     model.setHorizontalHeaderLabels(['col1', 'col2', 'col3']) 
     view.setModel(model) 
     view.setUniformRowHeights(True) 
     # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     # populate data 
     for i in range(3): 
      parent1 = QStandardItem('Family {}. Some long status text for sp'.format(i)) 
      parent1.setCheckable(True) 
      for j in range(3): 
       child1 = QStandardItem('Child {}'.format(i * 3 + j)) 
       child2 = QStandardItem('row: {}, col: {}'.format(i, j + 1)) 
       child3 = QStandardItem('row: {}, col: {}'.format(i, j + 2)) 
      parent1.appendRow([child1, child2, child3]) 
      model.appendRow(parent1) 
      # span container columns 
      view.setFirstColumnSpanned(i, view.rootIndex(), True) 
     # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     # expand third container 
     index = model.indexFromItem(parent1) 
     view.expand(index) 
     # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     # select last row 
     selmod = view.selectionModel() 
     index2 = model.indexFromItem(child3) 
     selmod.select(index2, QItemSelectionModel.Select | QItemSelectionModel.Rows) 


     layout.addWidget(view , 1, 0) 
     self.setTabText(2, "Education Details") 

     self.tab1.setLayout(layout) 




def main(): 
    app = QApplication(sys.argv) 
    ex = tabdemo() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

NB:他にご質問がありましたら、[新しい質問をしてください](http://stackoverflow.com/questions/ask)をご覧ください。 – ekhumoro

答えて

1

QStandardItemModelはモデルであり、データが入っています。ビューとその代理人が視覚化を処理します。

たぶんご利用の場合、それはより良いQTreeWidgetを務め、

2

そのsetItemWidget()機能を使用しているあなたは、行の任意の列にウィジェットを設定するためにsetIndexWidgetを使用することができます。

class tabdemo(QTabWidget): 
    ... 
    def tab1UI(self): 
     for i in range(3): 
      parent1 = QStandardItem('Family {}. Some long status text for sp'.format(i)) 
      parent1.setCheckable(True) 
      model.appendRow(parent1) 
      for j in range(3): 
       child1 = QStandardItem('Child {}'.format(i * 3 + j)) 
       child2 = QStandardItem('row: {}, col: {}'.format(i, j + 1)) 
       child3 = QStandardItem('row: {}, col: {}'.format(i, j + 2)) 
       child4 = QStandardItem() 
       parent1.appendRow([child1, child2, child3, child4]) 
       button = QToolButton() 
       button.setMaximumSize(button.sizeHint()) 
       view.setIndexWidget(child4.index(), button) 
1

場合は、「ボタン」により、あなたは各行の始めにボタンの単純なイメージを意味するので、QStandardItem :: setData(const QVariant &値、int role = Qt :: UserRole + 1)をロール= Qt :: DecorationRoleで使用し、値をQIconにすることができますまたはQPixmap。

たとえば、QPushButtonが必要な場合は、QStyledItemDelegateを継承してカスタムデリゲートを作成し、モデルの特定の表示をレンダリングすることを検討してください。

関連する問題