将QWidget添加到QListWidget

18

我正在尝试制作一个QListWidget,其中每个项目都是一个包含文本和PushButton的简单小部件。我使用以下代码:

itemN = QtGui.QListWidgetItem() 
#Create widget
widget = QtGui.QWidget()
widgetText =  QtGui.QLabel("I love PyQt!")
widgetButton =  QtGui.QPushButton("Push Me")
widgetLayout = QtGui.QHBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()
widget.setLayout(widgetLayout)
#Add widget to QListWidget funList
funList.addItem(itemN)
funList.setItemWidget(itemN, widget)

问题在于,没有任何东西显示出来。我可以使用键盘导航到一个空白行,但是它是空的。当小部件仅包含一个pushbutton时,它可以工作,因此并不是pushbutton本身弄乱了事情。是否有关于setItemWidget可以处理的窗口小部件复杂性的限制?也许我需要超越方便类,正如下面一些相关帖子中所建议的那样?

相关帖子

pyqt向QListWidget添加小部件
请注意,前一个帖子标题与我的类似,但似乎是关于QtDesigner代码拼贴(混合一些自定义内容)的相对含糊的问题。完全不清楚这实际上是提问者应该问的问题。尽管标题使其看起来像重复,但问题(我祈祷)并非如此。

我对这篇帖子也有类似的看法。

带有单选按钮的QListWidgetItem

具有自定义项和自定义项小部件的QListView/QListWidget

在QT中向QListWidget添加自定义小部件,单击问题在QT中?

pyqt向QListWidget添加小部件

http://www.qtcentre.org/threads/8660-Drawing-a-widget-in-QItemDelegate-s-paint-method

http://developer.nokia.com/community/discussion/showthread.php/211634-Adding-a-button-inside-QListWidgetItem

2个回答

31

试试这个:

itemN = QtGui.QListWidgetItem() 
#Create widget
widget = QtGui.QWidget()
widgetText =  QtGui.QLabel("I love PyQt!")
widgetButton =  QtGui.QPushButton("Push Me")
widgetLayout = QtGui.QHBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()

widgetLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
widget.setLayout(widgetLayout)  
itemN.setSizeHint(widget.sizeHint())    

#Add widget to QListWidget funList
funList.addItem(itemN)
funList.setItemWidget(itemN, widget)

正如您所看到的,您需要在布局中使用 setSizeConstraint,在项中使用 setSizeHint


能够工作了!我不是很清楚正在发生什么。1)一旦设置了大小约束,我是否真的需要对项目进行setSizeHint?似乎省略setSizeHint并不会改变我的GUI的外观。2)为什么我的大小提示默认为-1,-1,使用“SetFixedSize”如何解决这个问题?为什么它不只是将其固定在错误值(-1,-1)上。有没有好的文档介绍这些问题的内部情况?(文档包括:http://qt-project.org/doc/qt-4.8/qt.html#SizeHint-enum和http://qt-project.org/doc/qt-4.8/qlayout.html#SizeConstraint-enum) - eric
2
@neuronet QLayout::SetFixedSize 主窗口小部件的大小被设置为 sizeHint();,它将无法调整大小。如果不设置大小提示,则带标签和按钮的小部件将比项更大,因此会显得非常丑陋和不正确。 - Jablonski
1
接受答案,因为它解决了问题,但肯定会给任何解释其中内外情况的人点赞,以帮助下一个人超越盲目模仿编程的阶段 :) - eric

7
如果您使用PyQt5,有一些变更,您必须使用QtWidgets而不是QtGui来处理小部件。如果与PyQt5一起使用,请使用以下代码:

别忘了导入PyQt5:

from PyQt5 import QtCore, QtGui, QtWidgets`

itemN = QtWidgets.QListWidgetItem()
# Create widget
widget = QtWidgets.QWidget()
widgetText = QtWidgets.QLabel("I love PyQt!")
widgetButton = QtWidgets.QPushButton("Push Me")
widgetLayout = QtWidgets.QHBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()

widgetLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
widget.setLayout(widgetLayout)
itemN.setSizeHint(widget.sizeHint())

# Add widget to QListWidget funList
funList.addItem(itemN)
funList.setItemWidget(itemN, widget)


可爱,但有没有办法让这些填充了小部件的 QListWidgetItems 不会变得太高和浪费空间?它们只是太高了,浪费了空间。 - snaxxus
1
尝试一下:widgetLayout.setContentsMargins(0, 0, 0, 0) - S. Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接