2016-10-02 5 views
1

Ich benutze Python 3.5, und ich habe einen einfachen Code, der eine Tabelle mit einigen Kombinationsfeldern innerhalb davon erstellt. Hier ist der Code:PyQt5: Index der Zellen Widgets und ihre gewählten Werte erhalten

from PyQt5 import QtCore 
from PyQt5 import QtWidgets 
import sys 

app = QtWidgets.QApplication(sys.argv) 

########################## Create table ############################## 
tableWidget = QtWidgets.QTableWidget() 
tableWidget.setGeometry(QtCore.QRect(200, 200, 250, 300)) 
tableWidget.setColumnCount(2) 
tableWidget.setRowCount(9) 
tableWidget.show() 

################# Create tablecontent & comboboxes ################### 
names = ['Name 1', 'Name 2', 'Name 3', 'Name 4'] 
i = 0 
for j in names: 
    tableWidget.setItem(i, 0, QtWidgets.QTableWidgetItem(j)) 

    comboBox = QtWidgets.QComboBox() 
    combo_option_list = ["Choose...", "Option 1", "Option 2", "Option 3", "Option 4"] 
    for t in combo_option_list: 
     comboBox.addItem(t) 

    tableWidget.setCellWidget(i, 1, comboBox) 
    i += 1 

sys.exit(app.exec_()) 

Ich möchte mit diesen Combo-Boxen arbeiten, aber ich habe mehrere Probleme. Es beginnt schon mit der Tatsache, dass ich nur die zuletzt erstellte Combo-Box mit dem folgenden Befehl verwenden:

comboBox.activated[str].connect(do_something) 

Ich brauche die folgenden Dinge wissen:

  • Wie osignale für alle Kombinationsboxen?
  • Wie erhält man den Index der ausgewählten Combobox?
  • Wie erhalten Sie den Index der ausgewählten Combo-Box-Option, nachdem es ausgewählt wurde?
+0

Sie alle Comboboxen auf der Liste behalten können den Zugang zu allen haben - 'combobox_list.append (ComboBox) '. Sie können der ComboBox eigene Variablen zuweisen. 'comboBox.my_index = ich'. BTW: mehr pythonischer Weg 'für i, j in aufzählen (Namen):' – furas

+0

@furas Danke! Das hilft mir ein bisschen. 'combobox_list [n_box] .currentIndexChanged.connect (do_something)' Aber wie bekommt man den Index der combobox_list nachdem er angeklickt wurde? – saitam

+0

In 'do_something()' können Sie das Widget direkt aufrufen - 'widget = event.sender()' und Sie brauchen seinen Index nicht. Jetzt können Sie das tun. 'widget.addItem (" Andere Option ")', 'print (widget.my_index)', oder die ausgewählte Option 'widget.currentText()', usw. Wenn Sie einen Index benötigen und Sie 'comboBox.my_index' nicht erstellt haben dann können Sie Standardlistenfunktionen wie 'combobox_list.index (widget)' oder 'if widget in combobox_list' ausprobieren. – furas

Antwort

1

Beschreibung unten Code

from PyQt5 import QtCore 
from PyQt5 import QtWidgets 
import sys 

app = QtWidgets.QApplication(sys.argv) 

########################## Create table ############################## 

tableWidget = QtWidgets.QTableWidget() 
tableWidget.setGeometry(QtCore.QRect(200, 200, 250, 300)) 
tableWidget.setColumnCount(2) 
tableWidget.setRowCount(9) 
tableWidget.show() 

################# Create tablecontent & comboboxes ################### 

def dosomething(index): 
    widget = app.sender() 
    print('widget object:', widget) 
    print('widget myname:', widget.my_name) 
    print('widget index:', combo_list.index(widget)) 
    print('option index:', index) 

#--------------------------------------------------------------------- 

names = ['Name 1', 'Name 2', 'Name 3', 'Name 4'] 
combo_option_list = ["Choose...", "Option 1", "Option 2", "Option 3", "Option 4"] 

combo_list = [] 

for i, name in enumerate(names): 

    tableWidget.setItem(i, 0, QtWidgets.QTableWidgetItem(name)) 

    combobox = QtWidgets.QComboBox() 
    combobox.addItems(combo_option_list) 
    combobox.my_name = name + ' (i=' + str(i) + ')' 
    combobox.currentIndexChanged.connect(dosomething) 

    combo_list.append(combobox) 

    tableWidget.setCellWidget(i, 1, combobox) 

#--------------------------------------------------------------------- 

sys.exit(app.exec_()) 

Innen dosomething können Sie app.sender() verwenden Widget zu erhalten, die angeklickt wurde - und dann kann man es etwas mit diesem Widget zu tun verwenden.

PyQt führt dosomething mit Argument - es ist Index der ausgewählten Option in Combobox.

Um Index widget in combo_list erhalten Sie Standardliste Methode combo_list.index(widget)

Aber Sie auch eigene Variable in combobox (dh. my_name) Index oder anderen Wert zu halten

combobox.my_name = some_value 
können

und erstellen später können Sie in dosomething

value = widget.my_name 
erhalten
BTW

:

statt addItem(one_option) und for Schleife können Sie addItems(option_list)

verwenden Sie enumerate(names) verwenden können, und Sie werden nicht i = 0 und i += 1 brauchen

for i, j in enumerate(names): 

Sie combo_option_list vor for Schleife erstellen können.

+0

Danke für die Mühe! – saitam

0

Der schwierige Teil hier ist, den Index der Kombinationsfeld innerhalb der Tabelle zu erhalten, weil ein Zelle-Widget seinen eigenen Index nicht kennen kann. Eine Möglichkeit, dies zu lösen, ist die Verwendung der indexAt()-Methode der Tabelle, die einen Index von einer QPoint erhalten kann. Ein Zellen-Widget kennt seine eigene Position relativ zu seinem Elternteil, so kann dies an indexAt() übergeben werden, um seinen Index innerhalb der Tabelle zu erhalten.

Im Folgenden ist eine einfache Demo, die zeigt, wie die Signale verbinden und alle Informationen, die Sie wollen:

from PyQt5 import QtCore, QtWidgets 

class Window(QtWidgets.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.table = QtWidgets.QTableWidget(9, 2, self) 
     layout = QtWidgets.QVBoxLayout(self) 
     layout.addWidget(self.table) 
     names = ['Name 1', 'Name 2', 'Name 3', 'Name 4'] 
     options = ["Choose...", "Option 1", "Option 2", "Option 3", "Option 4"] 
     for index, name in enumerate(names): 
      self.table.setItem(index, 0, QtWidgets.QTableWidgetItem(name)) 
      comboBox = QtWidgets.QComboBox() 
      comboBox.activated.connect(self.comboActivated) 
      comboBox.addItems(options) 
      self.table.setCellWidget(index, 1, comboBox) 

    def comboActivated(self, option): 
     combo = self.sender() 
     print('option: %s, "%s"' % (option, combo.itemText(option))) 
     index = self.table.indexAt(combo.pos()) 
     print('row: %s, column: %s' % (index.row(), index.column())) 

if __name__ == '__main__': 

    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 200, 300, 300) 
    window.show() 
    sys.exit(app.exec_()) 
Verwandte Themen