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

时间:2019-01-02 23:58:44

标签: python pyqt pyqt5 qtablewidget qcombobox

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

可视化:

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好将其作为模型传递,以使其自动更新而不会不必要地使用信号。但是,由于您不希望显示任何空元素,因此可以将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_())