我有一个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_())
我不确定连接和插槽解决方案是否会是一个不错的选择?
答案 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_())