2016-12-13 8 views
1

ツリービュー項目のチェックボックスが変更されたとき、どうやってシグナルを出すことができますか?クリックした時にpythonがシグナルを出すQTreeviewアイテムのチェックボックスが変更された

import sys 
from PySide import QtGui, QtCore 

class Browser(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Browser, self).__init__(parent) 

     self.initUI() 

    def initUI(self): 
     self.resize(200, 300) 
     self.setWindowTitle('Assets') 
     self.setModal(True) 

     self.results = "" 

     self.uiItems = QtGui.QTreeView() 
     self.uiItems.setAlternatingRowColors(True) 
     self.uiItems.setSortingEnabled(True) 
     self.uiItems.sortByColumn(0, QtCore.Qt.AscendingOrder) 
     self.uiItems.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) 
     self.uiItems.header().setResizeMode(QtGui.QHeaderView.ResizeToContents) 

     grid = QtGui.QGridLayout() 
     grid.setContentsMargins(0, 0, 0, 0) 
     grid.addWidget(self.uiItems, 0, 0) 
     self.setLayout(grid) 

     self.show() 
     self.create_model() 

    def create_model(self): 
     items = [ 
      'Cookie dough', 
      'Hummus', 
      'Spaghetti', 
      'Dal makhani', 
      'Chocolate whipped cream' 
     ] 

     model = QtGui.QStandardItemModel() 
     model.setHorizontalHeaderLabels(['Name']) 

     for item in items: 
      model.insertRow(0) 

      # Append object 
      model.setData(model.index(0, 0), QtCore.Qt.Unchecked, role = QtCore.Qt.CheckStateRole) 
      model.setData(model.index(0, 0), item) 

      item = model.itemFromIndex(model.index(0,0)) 
      item.setCheckable(True) 


     self.uiItems.setModel(model) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Browser() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

答えて

0

QStandardItemModelからitemChanged信号を使用します。

import sys 
from PyQt4 import QtGui, QtCore 

class Browser(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Browser, self).__init__(parent) 

     self.initUI() 

    def initUI(self): 
     self.resize(200, 300) 
     self.setWindowTitle('Assets') 
     self.setModal(True) 

     self.results = "" 

     self.uiItems = QtGui.QTreeView() 
     self.uiItems.setAlternatingRowColors(True) 
     self.uiItems.setSortingEnabled(True) 
     self.uiItems.sortByColumn(0, QtCore.Qt.AscendingOrder) 
     self.uiItems.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) 
     self.uiItems.header().setResizeMode(QtGui.QHeaderView.ResizeToContents) 

     grid = QtGui.QGridLayout() 
     grid.setContentsMargins(0, 0, 0, 0) 
     grid.addWidget(self.uiItems, 0, 0) 
     self.setLayout(grid) 

     self.show() 
     self.create_model() 

    def create_model(self): 
     items = [ 
      'Cookie dough', 
      'Hummus', 
      'Spaghetti', 
      'Dal makhani', 
      'Chocolate whipped cream' 
     ] 

     model = QtGui.QStandardItemModel() 
     model.setHorizontalHeaderLabels(['Name']) 

     for item in items: 
      model.insertRow(0) 

      # Append object 
      model.setData(model.index(0, 0), QtCore.Qt.Unchecked, role = QtCore.Qt.CheckStateRole) 
      model.setData(model.index(0, 0), item) 

      item = model.itemFromIndex(model.index(0,0)) 
      item.setCheckable(True) 

     # Added the following line. 
     model.itemChanged.connect(self.test) 
     self.uiItems.setModel(model) 

    # Added the following method. 
    def test(self, item): 
     if item.text() == "Hummus": 
      if item.checkState() == QtCore.Qt.Checked: 
       # Hummus is selected 
       # do something here 
       pass 
      else: 
       # Hummus is deselected 
       # do something here 
       pass 
     if item.text() == "Spaghetti": 
      if item.checkState() == QtCore.Qt.Checked: 
       # Spaghetti is selected 
       # do something here 
       pass 
      else: 
       # Spaghetti is deselected 
       # do something here 
       pass 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Browser() 
    sys.exit(app.exec_()) 


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

itemChanged信号を使用しての大きな問題は、それが変更され何あなたを教えてくれないということです。変更されたデータの特定のロールを送信した場合は、非常に便利です。

それでも、興味のない他のタイプのデータ(偽装されている可能性があります)があります(fifteen pre-defined data rolesと任意の数のユーザー定義のものがあります)。

だから、より堅牢なソリューションは、サブクラスにモデルで、具体的な役割を含むカスタム信号を発します:

 model = StandardItemModel() 
     ... 

     self.uiItems.setModel(model) 
     model.itemDataChanged.connect(self.handleItemDataChanged) 

    def handleItemDataChanged(self, item, role): 
     if role == QtCore.Qt.CheckStateRole: 
      print(item.text(), item.checkState()) 


class StandardItemModel(QtGui.QStandardItemModel): 
    itemDataChanged = QtCore.Signal(object, object) 

    def setData(self, index, value, role=QtCore.Qt.EditRole): 
     oldvalue = index.data(role) 
     result = super(StandardItemModel, self).setData(index, value, role) 
     if result and value != oldvalue: 
      self.itemDataChanged.emit(self.itemFromIndex(index), role) 
     return result 
関連する問題