Python PyQT4 - 向QGridLayout添加未知数量的QComboBox小部件

时间:2009-10-30 02:18:25

标签: python pyqt qcombobox qlistview

我想从队列中检索人名列表,并且对于每个人,使用addWidget()函数将一个带有名称的复选框放到QGridLayout。我可以成功地将项目放在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 :(得分:1)

这一行:

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

不会将复选框添加到列表视图中,它只会以列表视图作为父项创建它,并且存在很大差异。

使用列表视图的最简单方法是QListWidget便利类。为此,请将复选框创建为QListWidgetItem的实例,然后在列表小部件上使用addItem将其添加到其中。

将它们添加到网格布局中是否有问题?通常,如果您拥有的复选框数量较少,则网格布局可能会更好 - 这一切都取决于您希望应用的外观。但是如果你可能有很多这样的对象,那么列表小部件/视图是最好的。

答案 1 :(得分:0)

我无法告诉你PyQt中的解决方案,但你需要遵循的结构如下。 QListView可以执行您需要的操作,您无需创建单独的复选框。创建QAbstractItemModelQStandardItemModel的子类(取决于您想要做多少编码)覆盖flags()方法以返回适当的标志,包括 {{ 3}},在columncount()方法中添加一个额外的列以包含复选框,并在data方法中为您希望复选框显示的列返回已选中状态Qt::Checked,{对于Qt::Unchecked {1}}。

这也可以使用Qt::ItemIsUserCheckable来完成,您可以使用QListWidget添加数据,而无需创建模型。在Qt::CheckStateRole上,您可以使用QListWidgetItemsetFlags(),而无需继承模型