从 Qtablewidget 中读取文本值并自动分配给 Qcombobox

Reading text value from Qtablewidget and assign automatically to Qcombobox

我有一个 QTableWidget 和一个 Qcombobox。我想从第一列 1 中的每个单元格中获取文本值,当用户插入新值时,它会自动分配并设置为 Qcombobox。我所说的每个单元格的意思是获取可用值,当单元格为空时什么都不做。

可视化:

from PyQt5 import QtCore, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setLayout(QtWidgets.QVBoxLayout())
        combo = QtWidgets.QComboBox(self)
        self.layout().addWidget(combo)

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.table = QtWidgets.QTableWidget(10, 2, self)
        self.comboBox = QtWidgets.QComboBox()
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        names = ['Name 1', 'Name 2', 'Name 3', 'Name 4', 'Name 5']
        for index, name in enumerate(names):
            self.table.setItem(index, 0, QtWidgets.QTableWidgetItem(name))

class Layout(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Layout, self).__init__()
        self.comb = Widget()
        self.table = Window()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.comb)

if __name__ == '__main__':

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

我不确定连接和插槽解决方案是否会给出一个好的选择?

在此最好作为模型传递,这样它会自动更新,而无需使用不必要的信号。但是由于您不希望显示任何空元素,因此请将 QSortFilterProxyModel 与 appropriate regex:

一起使用
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.table = QtWidgets.QTableWidget(10, 2)
        names = ['Name 1', 'Name 2', 'Name 3', 'Name 4', 'Name 5']
        for index, name in enumerate(names):
            self.table.setItem(index, 0, QtWidgets.QTableWidgetItem(name))

        proxy = QtCore.QSortFilterProxyModel(self)
        proxy.setSourceModel(self.table.model())
        proxy.setFilterRegExp(r"^(?!\s*$).+")

        self.comboBox = QtWidgets.QComboBox()
        self.comboBox.setModel(proxy)
        self.comboBox.setModelColumn(0)

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.comboBox)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 200, 300, 300)
    window.show()
    sys.exit(app.exec_())