显示隐藏小部件后如何将所有内容保持在正确位置?
How to keep everything in the correct position after having hidden widget shown?
我正在使用 PyQt6 制作一个小型音乐播放器。
我想在单击四个类型按钮中的任何一个之前隐藏 QListWidget,并在单击后显示。
您可以查看以下图片。
(之前):
(点击按钮后我希望看到的内容):
点击微笑(快乐)按钮后,列表出现了,但显示方式不正确。我的工具按钮被压缩了。
(我现在看到的):
这是我的代码。
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,0)
atmo_layout.addWidget(self.happy,0,1)
atmo_layout.addWidget(self.romantic,1,0)
atmo_layout.addWidget(self.sad,1,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"), QSize(100, 100), "happy"
)
self.romantic_button = self.create_button(
QIcon("./img/romantic.png"), QSize(100, 100), "romantic"
)
self.sad_button = self.create_button(
QIcon("./img/sad.png"), QSize(100, 100), "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, 0)
lay.addWidget(self.happy_button, 0, 1)
lay.addWidget(self.romantic_button, 1, 0)
lay.addWidget(self.sad_button, 1, 1)
lay.addWidget(self.songlist_widget, 2, 0, 1, 2)
lay.addWidget(self.play_button, 3, 0, 1, 2)
lay.addWidget(self.pause_button, 4, 0, 1, 2)
lay.addWidget(self.home_button, 5, 0, 1, 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()
我正在使用 PyQt6 制作一个小型音乐播放器。 我想在单击四个类型按钮中的任何一个之前隐藏 QListWidget,并在单击后显示。 您可以查看以下图片。
(之前):
(点击按钮后我希望看到的内容):
点击微笑(快乐)按钮后,列表出现了,但显示方式不正确。我的工具按钮被压缩了。
(我现在看到的):
这是我的代码。
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,0)
atmo_layout.addWidget(self.happy,0,1)
atmo_layout.addWidget(self.romantic,1,0)
atmo_layout.addWidget(self.sad,1,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"), QSize(100, 100), "happy"
)
self.romantic_button = self.create_button(
QIcon("./img/romantic.png"), QSize(100, 100), "romantic"
)
self.sad_button = self.create_button(
QIcon("./img/sad.png"), QSize(100, 100), "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, 0)
lay.addWidget(self.happy_button, 0, 1)
lay.addWidget(self.romantic_button, 1, 0)
lay.addWidget(self.sad_button, 1, 1)
lay.addWidget(self.songlist_widget, 2, 0, 1, 2)
lay.addWidget(self.play_button, 3, 0, 1, 2)
lay.addWidget(self.pause_button, 4, 0, 1, 2)
lay.addWidget(self.home_button, 5, 0, 1, 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()