如何动态调整 CustomQWidget 的高度

问题描述 投票:0回答:1

我正在创建一个带有自定义 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 的背景中,不会移动。 另外,我的自定义小部件的其他 QLabels 也已移动。 我尝试使用这个:堆栈线程

结果相同

好的 我猜问题出在我放置 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()) 当按下“查看代码”按钮之一时?

python python-3.x pyqt houdini
1个回答
0
投票

如果您使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.