0

私はコンボボックスとラインエディットでいっぱいのテーブルウィジェットを持っており、コンボボックスで選択された選択肢をテーブルウィジェットの別のコンボボックスで利用可能な選択肢に影響を与える方法を見つけたいと思っています。何かアイデアはありますか?

4

2 に答える 2

0

「私が言及するのを忘れていたのは、ボタンが押されたときにテーブルの各行のウィジェットが作成されるということです」、その場合、それらを動的に作成する必要があり、それらを識別できる必要があります (少なくとも最初のもの)。 .

QComboBoxクラス -を再実装したので、それらのいずれかが変更されると、識別子 (行番号) と選択されたもの (「名前」または「年齢」) を含むMyComboBoxシグナルが送信されます。そのシグナルは、2 列目のコンボボックスが変更されたクラスのメソッドfirstColumnComboBoxChangedをアクティブにします。changeSecondCombomainWin

このコードを実行します。「行を追加」ボタンをクリックして行を追加します。最初の列のコンボボックスを変更してみてください。

import sys
from PyQt4 import QtGui, QtCore

class myComboBox(QtGui.QComboBox):
    def __init__(self, comboID, mainForm):
        super(myComboBox, self).__init__()
        self.__comboID = comboID
        self.__mainForm = mainForm

        self.connect(self, QtCore.SIGNAL("currentIndexChanged (const QString&)"), self.indexChanged)

    def indexChanged(self, ind):
        # send signal to MainForm class, self.__comboID is actually row number, ind is what is selected
        self.__mainForm.emit(QtCore.SIGNAL("firstColumnComboBoxChanged(PyQt_PyObject,PyQt_PyObject)"), self.__comboID, ind) 

class mainWin(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.di = {"name":["raton", "kamal", "sujon"], "age":["45","21","78"]}

        lay = QtGui.QGridLayout(self)
        #create tableWidget and pushButton
        self.tableWidget = QtGui.QTableWidget()
        self.tableWidget.setColumnCount(2)
        self.pushButton = QtGui.QPushButton()
        self.pushButton.setText("Add row")
        lay.addWidget(self.tableWidget, 0, 0)
        lay.addWidget(self.pushButton, 1, 0)

        self.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.addRow)

        # Custom signal
        self.connect(self, QtCore.SIGNAL("firstColumnComboBoxChanged(PyQt_PyObject, PyQt_PyObject)"),         self.changeSecondCombo)

    def addRow(self):
        rowNumber = self.tableWidget.rowCount()
        self.tableWidget.insertRow(rowNumber)

        combo1=myComboBox(rowNumber, self)
        combo2=QtGui.QComboBox()
        combo1.addItems(["name", "age"])
        combo2.addItems(self.di["name"])

        self.tableWidget.setCellWidget(rowNumber, 0, combo1)
        self.tableWidget.setCellWidget(rowNumber, 1, combo2)


    def changeSecondCombo(self, row, ind):
        combo2 = self.tableWidget.cellWidget(row, 1)
        if combo2:
            combo2.clear()
            combo2.addItems(self.di["%s"%(ind)])

def main():
    app = QtGui.QApplication(sys.argv)
    form = mainWin()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()
于 2013-09-09T08:11:38.050 に答える