从 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_())
我有一个 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_())