我正在创建一个带有自定义 QWidget 作为 QList 项的 QList。
这个 CustomQWidget 有一个 QButton,可以在其底部显示或隐藏 QLabel。
如果我可以显示/隐藏 QLabel,我的 CustomQwidget 就不会调整大小以适应新配置。
class CustomQWidget (QWidget):
"""Custom Qt Widget to be transformed to an item
for a QListWidget"""
def __init__ (self, parent = None):
super(CustomQWidget, self).__init__(parent)
self.textQVBoxLayout = QVBoxLayout()
self.txtNameQLabel = QLabel()
self.subTextQHBoxLayoutUp = QHBoxLayout()
self.subTextQHBoxLayoutBot = QHBoxLayout()
self.txtAuthorQLabel = QLabel()
self.txtDateQLabel = QLabel()
self.txtContextQLabel = QLabel()
self.txtTypeQLabel = QLabel()
self.txtClassQLabel = QLabel()
self.codeQVBoxLayout = QVBoxLayout()
self.codeQVBoxLayout.addStretch()
self.txtCodeQLabel = QLabel()#QLabel to show/hide
self.txtCodeQLabel.setVisible(False)
self.codeQVBoxLayout.addWidget(self.txtCodeQLabel)
self.subTextQHBoxLayoutUp.addWidget(self.txtNameQLabel)
self.subTextQHBoxLayoutUp.addWidget(self.txtAuthorQLabel)
self.subTextQHBoxLayoutUp.addWidget(self.txtDateQLabel)
self.subTextQHBoxLayoutBot.addWidget(self.txtContextQLabel)
self.subTextQHBoxLayoutBot.addWidget(self.txtTypeQLabel)
self.subTextQHBoxLayoutBot.addWidget(self.txtClassQLabel)
self.textQVBoxLayout.addLayout(self.subTextQHBoxLayoutUp)
self.textQVBoxLayout.addLayout(self.subTextQHBoxLayoutBot)
self.upQHBoxLayout = QHBoxLayout()
self.copyButton = QPushButton('Copy')
self.codeViewbutton = QPushButton('View code')#Trigger button to show/hide txtCodeQLabel
self.codeViewbutton.clicked.connect(functools.partial(self.showHideCode, self.txtCodeQLabel))
self.upQHBoxLayout.addWidget(self.copyButton)
self.upQHBoxLayout.addWidget(self.codeViewbutton)
self.upQHBoxLayout.addLayout(self.textQVBoxLayout, 1)
self.globalLayout = QVBoxLayout()
self.globalLayout.addLayout(self.upQHBoxLayout)
self.globalLayout.addLayout(self.codeQVBoxLayout)
self.globalLayout.addStretch()
self.setLayout(self.globalLayout)
# setStyleSheet
self.txtNameQLabel.setStyleSheet('''color: rgb(255, 128, 64);''')
self.txtAuthorQLabel.setStyleSheet('''color: rgb(128, 128, 128);''')
def setTxtName (self, text):
self.txtNameQLabel.setText(text)
def setTxtAuthor (self, text):
self.txtAuthorQLabel.setText(text)
def setTxtDate (self, text):
self.txtDateQLabel.setText(text)
def setTxtContext (self, text):
self.txtContextQLabel.setText(text)
def setTxtType (self, text):
self.txtTypeQLabel.setText(text)
def setTxtClass (self, text):
self.txtClassQLabel.setText(text)
def setTxtCode (self, text):
self.txtCodeQLabel.setText(text)
def showHideCode(self, label):
if label.isVisible():
label.setVisible(False)
else:
label.setVisible(True)
我尝试将
self.adjustSize()
添加到 showHideCode() 方法,但如果 QLabel 完全出现,它位于其他 QList iems 的背景中,不会移动。
另外,我的自定义小部件的其他 QLabel 也已移动。
我尝试使用这个:堆栈线程
结果相同
好的 - 我想问题出在我放置 CustomWidget 的 QListWidget 中
def populateMainLayout(self,json_disk_file):
"""Populate QListWidget with configured
CustomQWidget from json entry"""
listing = QListWidget()
current_data = self.openJson(json_disk_file)
for entry in current_data:
myQCustomQWidget = CustomQWidget()
myQCustomQWidget.setTxtName(str(entry['name']))
myQCustomQWidget.setTxtDate(str(entry['date']))
myQCustomQWidget.setTxtAuthor(str(entry['author']))
myQCustomQWidget.setTxtContext(str(entry['context']))
myQCustomQWidget.setTxtType(str(entry['type']))
myQCustomQWidget.setTxtClass(str(entry['class']))
myQCustomQWidget.setTxtCode(str(entry['snip']))
q_widgetitem = QListWidgetItem(listing)
q_widgetitem.setSizeHint(myQCustomQWidget.sizeHint())
listing.addItem(q_widgetitem)
listing.setItemWidget(q_widgetitem, myQCustomQWidget)
return listing
如何重新执行
q_widgetitem.setSizeHint(myQCustomQWidget.sizeHint())
当按下“查看代码”按钮之一时?
我尝试在CustomWidget实例中获取相应的QListWidgetItem。
现在,当我按下“查看代码”按钮时,代码会出现,并且 QListWidgetItem 的大小会刷新,但是当我再次单击该按钮时,QLabel 的文本会被隐藏,但 QListWidgetItem 不会正确刷新其大小,就像@musicamante 提供的代码。
...
for entry in current_data:
...
q_widgetitem.setSizeHint(myCustomQWidget.sizeHint())
myCustomQWidget.getListItem(q_widgetitem)#get the QListWidgetItem receiveing the CustomQWidget instance
class CustomQWidget (QWidget):
...
def getListItem (self, item):
self.item = item
def showHideCode(self, label):
if label.isVisible():
label.setVisible(False)
self.item.setSizeHint(self.sizeHint())
else:
label.setVisible(True)
self.item.setSizeHint(self.sizeHint())
如果您使用
setSizeHint()
,您将根据小部件的当前提示静态地设置项目的大小提示。
显然,如果小部件的内容发生变化,该项目将对此一无所知。
Qt 没有直接的方法来通知小部件的大小提示何时发生变化,但我们可以假设,每当其某些内容显式更改时(例如,更新标签时,或改变孩子的可见性)。
一个可能的解决方案是添加一个自定义信号,在需要时发出新的尺寸提示,然后将该信号连接到项目的
setSizeHint()
。
class CustomQWidget(QWidget):
sizeHintChanged = pyqtSignal(QSize)
...
# for any function that may change the hint, call this
def emitSizeHintChanged(self):
self.sizeHintChanged.emit(self.sizeHint())
# for example:
def showHideCode(self, label):
label.setVisible(not label.isVisible())
self.emitSizeHintChanged()
然后,每当在列表视图上创建并设置项目时,将信号连接到项目的
setSizeHint
:
def populateMainLayout(self, json_disk_file):
...
for entry in current_data:
...
q_widgetitem.setSizeHint(myQCustomQWidget.sizeHint())
myQCustomQWidget.sizeHintChanged.connect(q_widgetitem.setSizeHint)
肮脏......但它有效
def showHideCode(self, label):
if label.isVisible():
label.setVisible(False)
self.item.setSizeHint(QtCore.QSize(100,60))
else:
label.setVisible(True)
self.item.setSizeHint(self.sizeHint())