2012-03-11 85 views
3

我希望在發送特定信號時啓用/禁用QTreeWidget中的可檢查項目。如何啓用/禁用基於QTreeView事件的項目?

下面的代碼DOWS不起作用:

model = QStandardItemModel() 
view = QTreeView() 
view.setModel(model) 
rootItem = QStandardItem() 
rootItem = model.invisibleRootItem() 

categoryItem = QStandardItem(item) 
categoryItem.setCheckable(True) 
rootItem.appendRow(categoryItem) 

signalSource.availabilityChanged.connect(categoryItem.setEnabled) 

它產生錯誤:

TypeError: unhashable type: 'PySide.QtGui.QStandardItem' 

是否有經由信號/槽改變QStandardItem的狀態或數據的解決方案?

+0

你可以發佈完整的回溯和'signalSource'的定義嗎? – Avaris 2012-03-11 10:56:56

回答

3

這看起來像在PySide中的錯誤,因爲connect應該接受任何調用(示例代碼正常工作PyQt4中)。

作爲一種變通方法,嘗試在拉姆達包裝QStandardItem方法:

signalSource.availabilityChanged.connect(
    lambda enable: categoryItem.setEnabled(enable)) 

編輯

要連接在一個循環的項目,使用默認參數,就像這樣:

for button in buttonList: 
    item = QStandardItem("Test") 
    ... 
    button.toggled.connect(
     lambda enable, item=item: item.setEnabled(enable)) 
+0

謝謝。這幫了很多。 – leviathan 2012-03-14 17:21:16

+0

@leviathan。查看我的更新回答,瞭解如何在循環中使用'lambda'。 – ekhumoro 2012-03-14 22:56:05

1

在ekhumoros答案的幫助下,我找到了解決問題的方法,但它似乎是PyS中一個醜陋的解決方法ide,使用發件人來正確連接信號。

import sys 
import argparse 
import signal 

#import sip 
#sip.setapi('QString', 2) 
#from PyQt4.QtGui import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QStandardItemModel, QStandardItem, QTreeView 
from PySide.QtGui import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QStandardItemModel, QStandardItem, QTreeView 


class MainWindow(QWidget): 
    def __init__(self, parent=None): 
       QWidget.__init__(self, parent) 

       buttonList = [] 
       for i in xrange(10): 
        button = QPushButton("1") 
        button.setCheckable(True) 
        buttonList.append(button) 

       model = QStandardItemModel() 
       view = QTreeView() 

       view.setModel(model) 

       layout = QVBoxLayout() 
       self.setLayout(layout) 

       buttonLayout = QHBoxLayout() 
       layout.addLayout(buttonLayout) 

       for button in buttonList: 
        buttonLayout.addWidget(button) 

       layout.addWidget(view) 

       rootItem = QStandardItem() 
       rootItem = model.invisibleRootItem() 

       self.itemList = {} 
       for button in buttonList: 
        item = QStandardItem("Test") 
        item.setCheckable(True) 
        rootItem.appendRow(item) 
        self.itemList[button] = item 

        # Works with PyQt4, but not with PySide 
        #button.toggled.connect(item.setEnabled) 
        # Workaround for PySide 
        button.toggled.connect(self.workaround) 

       for button in buttonList: 
        button.setChecked(True) 


      def workaround(self, enable): 
       self.itemList[self.sender()].setEnabled(enable) 


def main(argv): 
    app = QApplication(argv) 
    w = MainWindow() 
    w.show() 
    retcode = app.exec_() 


if __name__ == "__main__": 
    main(sys.argv) 

只使用lambda結構在循環中不起作用。它只是連接所有信號和最後一個參考來迭代。

相關問題