PyQt5:获取单元格小部件的索引及其选择的值

时间:2016-10-02 06:01:37

标签: python pyqt signals-slots qtablewidget qcombobox

我正在使用Python 3.5,我有一个简单的代码,它创建一个包含几个组合框的表。这是代码:

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)

我需要了解以下事项:

  • 如何连接所有组合框的信号?
  • 如何获取所选组合框的索引?
  • 如何在选择组合框选项后获取所选组合框选项的索引?

2 个答案:

答案 0 :(得分: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 - 它是组合框中所选选项的索引。

要在widget中获取combo_list的索引,您可以使用标准列表方法combo_list.index(widget)

但你也可以在组合框中创建自己的变量(即my_name)来保持索引或其他值

combobox.my_name = some_value

以后您可以进入dosomething

value = widget.my_name

BTW:

而不是addItem(one_option)for循环,您可以使用addItems(option_list)

您可以使用enumerate(names),但不需要i = 0i += 1

for i, j in enumerate(names):

您可以在combo_option_list循环之前创建for

答案 1 :(得分: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_())