将 QWidget 添加到 QListWidget

Posted

技术标签:

【中文标题】将 QWidget 添加到 QListWidget【英文标题】:Add QWidget to QListWidget 【发布时间】:2014-11-29 17:13:35 【问题描述】:

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

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)

问题是,什么都没有出现。我得到一个可以使用键盘导航的空白行,但它是空白的。当小部件包含只是一个按钮时,它就可以工作,所以好像按钮本身不会把事情搞砸。 setItemWidget 可以处理的小部件的复杂性是否有限制?也许我需要超越便利课程,正如下面一些相关帖子中所建议的那样?

相关帖子

pyqt adding a widget to a QListWidget 请注意,上一篇文章的标题与我的相似,但似乎是一个关于来自 QtDesigner 的复杂代码(与一些自定义内容混合)的表达相对较差的问题。根本不清楚这实际上是这个人应该问的问题。虽然标题使它看起来像重复,但问题(我祈祷)不是。

关于this 的帖子,我会说类似的话。

QListWidgetItem with Radio Button

QListView/QListWidget with custom items and custom item widgets

Adding Custom Widget to QListWidget in QT click issue in QT?

pyqt adding a widget to a 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

【问题讨论】:

【参考方案1】:

试试这个:

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)。有什么好的文档可以了解这些问题的来龙去脉吗? (文档包括:qt-project.org/doc/qt-4.8/qt.html#SizeHint-enum 和 qt-project.org/doc/qt-4.8/qlayout.html#SizeConstraint-enum) @neuronet QLayout::SetFixedSize 主部件的大小设置为sizeHint(); 它根本无法调整大小。如果你不设置尺寸提示,你的带有标签和按钮的小部件会比项目大,所以它会非常难看和不正确。 接受答案,因为它解决了问题,但肯定会支持任何解释这个细节的人,让下一个人超越货物崇拜编程:)【参考方案2】:

如果你使用PyQt5,有一些变化,你必须使用QtWidgets for widget 而不是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 不会变成绝对的chonkers?它们太高了,浪费了空间。 @user1469620 试试看:widgetLayout.setContentsMargins(0, 0, 0, 0)

以上是关于将 QWidget 添加到 QListWidget的主要内容,如果未能解决你的问题,请参考以下文章

将自定义 QWidget 添加到 QListWidget

如何将 QAction 添加到 QListWidget

qt QListWidget 添加鼠标移动事件(mouseMoveEvent),让父窗体可以监听到鼠标移动

在父 QWidget 区域之外显示子 QWidget

QListWidget或QListView内怎么添加QCheckBox

如何将图标添加到 QListWidget