2016-10-02 13 views
1

Я использую Python 3.5, и у меня есть простой код, который создает таблицу с несколькими встроенными в нее ящиками. Вот код:PyQt5: получить индекс виджетов ячейки и их выбранные значения

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_()) 

Я хочу работать с этими списками, но у меня есть несколько проблем. Это уже начинается с того, что я могу использовать только последний созданный комбо-бокс с помощью следующей команды:

comboBox.activated[str].connect(do_something) 

мне нужно знать следующие вещи:

  • Как подключить сигналы для всех комбо-боксы?
  • Как получить индекс выбранного комбинированного блока?
  • Как получить индекс выбранного варианта со списком после его выбора?
+0

Вы можете сохранить все ComboBoxes в списке, чтобы иметь доступ ко всем - 'combobox_list.append (COMBOBOX) '. Вы можете назначить собственные переменные comboBox, т.е. 'comboBox.my_index = i'. BTW: больше pythonic way 'для i, j в перечислении (имена):' – furas

+0

@furas Спасибо! Это помогает мне немного. 'combobox_list [n_box] .currentIndexChanged.connect (do_something)' Но как получить индекс списка combobox_list после его нажатия? – saitam

+0

В 'do_something()' вы можете получить виджет напрямую - 'widget = event.sender()', и вам не нужен его индекс. Теперь вы можете это сделать. 'widget.addItem (« Другой вариант »)', 'print (widget.my_index)' или получить выбранный параметр 'widget.currentText()' и т. д. Если вам нужен индекс, и вы не создали 'comboBox.my_index' то вы можете попробовать стандартные функции списка, такие как 'combobox_list.index (widget)' или 'if widget в combobox_list'. – furas

ответ

1

Описание ниже код

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_()) 

Внутри dosomething вы можете использовать app.sender(), чтобы получить виджет, который щелкнул - и тогда вы можете использовать его, чтобы сделать что-то с этим виджетом.

PyQt выполняет dosomething с аргументом - это индекс выбранного параметра в combobox.

Чтобы получить индекс widget в combo_list вы можете использовать стандартный метод списка combo_list.index(widget)

Но вы также можете создать свою собственную переменную в выпадающем списке (то есть. my_name), чтобы индекс или другое значение

combobox.my_name = some_value 

и позже вы можете получить в dosomething

value = widget.my_name 

КСТАТИ:

вместо addItem(one_option) и for петли вы можете использовать addItems(option_list)

Вы можете использовать enumerate(names) и вам не нужно будет i = 0 и i += 1

for i, j in enumerate(names): 

Вы можете создать combo_option_list до того for цикла.

+0

Спасибо за внимание! – saitam

0

Трудная часть здесь получает индекс комбинированного поля внутри таблицы, потому что виджет ячейки не может знать свой собственный индекс. Один из способов решения этой проблемы - использовать метод таблицы indexAt(), который может получить индекс от QPoint. Виджет-ячейка делает свой собственный адрес относительно его родителя, поэтому его можно передать indexAt(), чтобы получить его индекс в таблице.

Ниже приведен простой демо, которое показывает, как подключить сигналы и получить всю информацию, которую вы хотите:

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_())