将 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的主要内容,如果未能解决你的问题,请参考以下文章
qt QListWidget 添加鼠标移动事件(mouseMoveEvent),让父窗体可以监听到鼠标移动