【问题标题】:PyQt5: get index of cell widgets and their chosen valuesPyQt5:获取单元格小部件的索引及其选择的值
【发布时间】:2017-02-10 09:02:38
【问题描述】:

我使用的是 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)

我需要知道以下几点:

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

【问题讨论】:

  • 您可以将所有组合框保留在列表中以访问所有 - combobox_list.append(comboBox)。您可以将自己的变量分配给组合框,即。 comboBox.my_index = i。顺便说一句:更多pythonic方式for i, j in enumerate(names):
  • @furas 谢谢!这对我有一点帮助。 combobox_list[n_box].currentIndexChanged.connect(do_something)但是combobox_list被点击后如何获取索引呢?
  • do_something() 你可以直接获取小部件 - widget = event.sender() 并且你不需要它的索引。现在你可以做即。 widget.addItem("Other Option"), print(widget.my_index), 或获取选定选项widget.currentText() 等。如果您需要索引并且您没有创建comboBox.my_index,那么您可以尝试标准列表功能,如combobox_list.index(widget)if widget in combobox_list
  • 我试过你的代码,当你不像zetcode.com/gui/pyqt5/widgets2那样创建类时,它的工作方式似乎有所不同
  • 您必须在do_something 中使用widget = app.sender() 才能获取小部件。 PyQt 使用参数index 调用do_something(index) - 所以你有所选选项的索引。

标签: python pyqt signals-slots qtablewidget qcombobox


【解决方案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 - 它是组合框中选定选项的索引。

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

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

combobox.my_name = some_value

以后你可以进入dosomething

value = widget.my_name

顺便说一句:

您可以使用addItems(option_list) 来代替addItem(one_option)for 循环

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

for i, j in enumerate(names):

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

【讨论】:

    【解决方案2】:

    这里的棘手部分是获取表格中组合框的索引,因为单元格小部件无法知道自己的索引。解决这个问题的一种方法是使用表的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_())
    

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多