显示隐藏小部件后如何将所有内容保持在正确的位置?

问题描述

我正在使用 PyQt6 制作一个小型音乐播放器。 我想在单击四个流派按钮中的任何一个之前隐藏 QListWidget 并在单击后显示。 您可以查看以下图片

(之前):

(before)

(我希望在点击按钮后看到的):

(what I expected to see after the button is clicked)

在我点击微笑(快乐)按钮后,列表出现但不正确。我的工具按钮被压缩了。

(我现在看到的):

(what I see now)

这是我的代码

from PyQt6.QtWidgets import *
from PyQt6.QtGui import *
from PyQt6.QtCore import*
class atmoUI(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        super().__init__()
        layout=QVBoxLayout(self)
        atmo_layout=qgridLayout(self)
        self.aggressive=QToolButton(self)
        self.aggressive.setFixedSize(100,100)
        self.aggressive.setIcon(QIcon('./img/aggressive.png'))
        self.aggressive.setIconSize(QSize(100,100))
        self.aggressive.setToolTip('aggressive')
        self.happy=QToolButton(self)
        self.happy.setFixedSize(100,100)
        self.happy.setIcon(QIcon('./img/happy.png'))
        self.happy.setIconSize(QSize(100,100))
        self.happy.setToolTip('happy')
        self.romantic=QToolButton(self)
        self.romantic.setFixedSize(100,100)
        self.romantic.setIcon(QIcon('./img/romantic.png'))
        self.romantic.setIconSize(QSize(100,100))
        self.romantic.setToolTip('romantic')
        self.sad=QToolButton(self)
        self.sad.setFixedSize(100,100)
        self.sad.setIcon(QIcon('./img/sad.png'))
        self.sad.setIconSize(QSize(100,100))
        self.sad.setToolTip('sad')
    
        atmo_layout.addWidget(self.aggressive,0)
        atmo_layout.addWidget(self.happy,1)
        atmo_layout.addWidget(self.romantic,1,0)
        atmo_layout.addWidget(self.sad,1)

        self.play=QPushButton(self)
        self.pause=QPushButton(self)
        self.play.setText('play')
        self.pause.setIcon(QIcon('./img/pause.png'))

        self.songlist=QListWidget(self)

        self.home=QPushButton(self)
        self.home.setText("home")
        self.home.setIcon(QIcon('./img/home.png'))
        layout.addLayout(atmo_layout)
        layout.addWidget(self.songlist)
        layout.addWidget(self.play)
        layout.addWidget(self.pause)
        layout.addWidget(self.home)
        self.play.setVisible(False)
        self.pause.setVisible(False)
        self.songlist.setVisible(False)
        self.setLayout(layout)

我是 PyQt 的新手,我搜索了一段时间,但仍然找不到解决方案。有谁知道如何解决这个问题?

解决方法

你有很多凌乱和冗余的代码,所以我将避免分析它,但只会指出一个可能的实现。

在这种情况下,可以使用 QGridLayout 而无需 QVBoxLayout。

from PyQt6.QtWidgets import (
    QApplication,QGridLayout,QListWidget,QPushButton,QToolButton,QWidget,)
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import QSize


class Widget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.aggressive_button = self.create_button(
            QIcon("./img/aggressive.png"),QSize(100,100),"aggressive"
        )
        self.happy_button = self.create_button(
            QIcon("./img/happy.png"),"happy"
        )
        self.romantic_button = self.create_button(
            QIcon("./img/romantic.png"),"romantic"
        )
        self.sad_button = self.create_button(
            QIcon("./img/sad.png"),"sad"
        )
        self.songlist_widget = QListWidget()
        self.play_button = QPushButton(text="play")
        self.pause_button = QPushButton(icon=QIcon("./img/pause.png"))
        self.home_button = QPushButton(text="home",icon=QIcon("./img/home.png"))

        lay = QGridLayout(self)
        lay.addWidget(self.aggressive_button,0)
        lay.addWidget(self.happy_button,1)
        lay.addWidget(self.romantic_button,1,0)
        lay.addWidget(self.sad_button,1)
        lay.addWidget(self.songlist_widget,2,2)
        lay.addWidget(self.play_button,3,2)
        lay.addWidget(self.pause_button,4,2)
        lay.addWidget(self.home_button,5,2)
        lay.setRowStretch(6,-1)

        self.play_button.hide()
        self.pause_button.hide()
        self.songlist_widget.hide()

        self.resize(self.width(),400)
        self.setFixedWidth(self.sizeHint().width())

        self.happy_button.clicked.connect(self.handle_happy_clicked)

    def create_button(self,icon,size,tooltip):
        button = QToolButton(icon=icon,iconSize=size)
        button.setFixedSize(size)
        button.setToolTip(tooltip)
        return button

    def handle_happy_clicked(self):
        self.songlist_widget.show()


if __name__ == "__main__":
    app = QApplication([])
    window = Widget()
    window.show()
    app.exec()