2016-11-21 5 views
0

Ich habe diesen Code, um Registerkarten und Strukturansicht zu haben. Ich möchte, dass jede Zeile in einer Baumansicht einige kleine Schaltflächen haben würde. Wie kann ich einer Reihe von Baumansichten Schaltflächen hinzufügen?So fügen Sie eine Schaltfläche zu einer QTreeView-Zeile hinzu

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: Wenn Sie andere Fragen haben, bitte [fragen Sie eine neue] (http://stackoverflow.com/questions/ask). – ekhumoro

Antwort

1

QStandardItemModel ist ein Modell, also enthält es nur Daten. Die Ansicht und ihre Delegierten behandeln die Visualisierungen.

Vielleicht besser Ihr Anwendungsfall mit einem QTreeWidget serviert und mit seiner setItemWidget() Funktion

2

Sie setIndexWidget verwenden können, ein Widget auf jeder Spalte einer Zeile zu setzen:

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

Wenn von „Knopf“ Sie meinen ein einfaches Bild einer Schaltfläche am Anfang jeder Zeile. Sie können QStandardItem :: setData (const QVariant & value, int-Rolle = Qt :: UserRole + 1) mit role = Qt :: DecorationRole und Wert als QIcon verwenden oder eine QPixmap.

Wenn Sie beispielsweise ein QPushButton verwenden möchten, sollten Sie in Erwägung ziehen, Ihren benutzerdefinierten Delegaten zu erstellen, indem Sie QStyleDitemDelegate erben und eine bestimmte Anzeige Ihres Modells rendern.

Verwandte Themen