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

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

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

最佳答案

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

关于python - 从 Qtablewidget 读取文本值并自动分配给 Qcombobox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014730/

相关文章:

python - Keras - 无法通过裁剪来限制输出

python - PyQt:如何在不卡住 GUI 的情况下更新进度?

python - 如何迭代 QGroupBox 中的所有 QPushButton

python - 如何在 QGraphicsScene 中定位和锚定文本?

python - 从 Anaconda 缩小到 Miniconda

python - 使用 Powershell 安装最新版本的 Python 的首选方式是什么?打包的二进制文件还是在线安装?

Python .month 格式是 numeric(1) 想要 MMM(Jan)

qt - 如何正确处理具有重叠鼠标区域的 QML TableView 中的鼠标事件?

python - 突然导入错误: cannot import name "QtCore" from "PyQt5"

python - PyQt5 QGraphicsView透明背景