Python PyQT4 - 向QGridLayout添加不确定数量的QComboBox控件

0 投票
2 回答
1424 浏览
提问于 2025-04-15 15:31

我想从一个队列中获取一组人的名字,然后为每个人在QGridLayout中放一个带有他们名字的复选框,使用addWidget()这个函数。我可以成功地把这些名字放到QListView里,但它们却重叠在一起,而不是形成新的行。有没有人有什么想法可以帮我解决这个问题?

self.chk_People = QtGui.QListView()
items = self.jobQueue.getPeopleOffQueue()

for item in items:
    QtGui.QCheckBox('%s' % item, self.chk_People)

self.jobQueue.getPeopleOffQueue() 如果有帮助的话,会返回类似 ['Bob', 'Sally', 'Jimmy'] 这样的内容。

2 个回答

0

我不能直接告诉你在PyQt中的解决方案,但我可以告诉你需要遵循的结构。你可以使用QListView来实现你想要的功能,不需要单独创建复选框。你可以创建一个QAbstractItemModel或QStandardItemModel的子类(具体选择哪个取决于你想写多少代码),然后重写flags()方法,让它返回合适的标志,特别是要包括Qt::ItemIsUserCheckable。接着,在columncount()方法中添加一个额外的列来放复选框,而在data方法中,对于你想放复选框的那一列,返回复选框的状态,比如Qt::Checked表示选中,Qt::Unchecked表示未选中,使用Qt::CheckStateRole来处理这些状态。

另外,你也可以使用QListWidget来实现这个功能。在QListWidget中,你可以使用QListWidgetItem来添加数据,这样就不需要创建模型了。在QListWidgetItem上,你可以使用setFlags()和setData(QVariant(bool, Qt::CheckStateRole)来设置复选框的状态,而不需要去创建模型的子类。

1

这一行代码:

QtGui.QCheckBox('%s' % item, self.chk_People)

并没有把复选框真正添加到列表视图中,它只是把复选框创建出来,并把列表视图设为它的父级,这两者之间有很大区别。

使用列表视图最简单的方法是用 QListWidget 这个方便的类。你需要把复选框创建为 QListWidgetItem 的实例,然后用 addItem 方法把它们真正添加到列表小部件中。

你在把复选框添加到网格布局时遇到问题了吗?通常来说,如果你的复选框数量不多,使用网格布局可能会更好——这完全取决于你想让你的应用看起来怎样。不过,如果你可能会有很多这样的对象,那么使用列表小部件/视图是最好的选择。

撰写回答