0

PyQt6 を使用して小さな音楽プレーヤーを作成しています。4 つのジャンル ボタンのいずれかをクリックする前に 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 を初めて使用し、しばらく検索しましたが、まだ解決策が見つかりませんでした。これを修正する方法を知っている人はいますか?

4

1 に答える 1

1

乱雑で冗長なコードがたくさんあるので、分析は避けますが、可能な実装を指摘するだけです。

この場合、QVBoxLayout を必要とせずに QGridLayout を使用できます。

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()
于 2021-07-16T21:53:13.580 に答える