【问题标题】:How to access current QComboBox data inside QTreeWidget如何在 QTreeWidget 中访问当前的 QComboBox 数据
【发布时间】:2016-10-21 17:57:12
【问题描述】:

我在这个上使用 PySide。我似乎无法访问嵌入在树小部件中的组合框中的当前文本。我能得到的是来自最后一个组合框创建的当前文本。请注意,在我的主程序中,这些组合框将动态生成,因此它们的数量不会固定。所以没办法建立唯一标识符。

import sys
from PySide import QtCore
from PySide import QtGui

class Example(QtGui.QMainWindow):    
    def __init__(self):
        super(Example, self).__init__()
        self.di = {"name":["Bill", "Dan", "Steve"], "age":["45","21","78"]}        
        self.initUI()
        self.populateTree()

    def initUI(self):
        self.tree = QtGui.QTreeWidget()
        self.tree.setColumnCount(1)
        self.setCentralWidget(self.tree)
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')    
        self.show()

    def populateTree(self):
        # Add widget item to tree
        for key, value in self.di.iteritems():
            item1 = QtGui.QTreeWidgetItem()
            item1.setText(0, key)
            item1.setExpanded(True)
            self.tree.addTopLevelItem(item1)
            # Add Combo Box to widget item
            item2 = QtGui.QTreeWidgetItem(item1)
            combo = QtGui.QComboBox(self.tree)
            combo.addItems(value)
            self.tree.setItemWidget(item2, 0, combo)
            combo.currentIndexChanged.connect(lambda: self.doSomething(combo.currentText()))

    def doSomething(self, n):
        print n            

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

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pyqt4 pyside signals-slots qcombobox


    【解决方案1】:

    使用默认参数缓存当前实例:

    combo.currentIndexChanged.connect(
        lambda index, combo=combo: self.doSomething(combo.currentText()))
    

    【讨论】:

    • 我有一个后续问题。如果我使用 QLineEdit 小部件,这将如何工作?我知道 currentIndexChanged 采用 index 参数。但是 QLineEdit 的 returnPressed 似乎没有任何争论。
    • 我想通了:
    • line.returnPressed.connect(lambda line=line: self.doSomething(line.text()))
    • @Berkyjay。 currentIndexChanged 需要 index 来阻止 combo 参数被覆盖。通常,您只需要在信号发送参数时指定参数。如果有疑问,您可以使用,例如lambda *args, widget=widget: ...,应该适用于所有情况。
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 2013-09-15
    • 2015-05-14
    • 2015-05-27
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多