2

我试图弄清楚如何将填充的 QVBoxLayout 添加到 QFrame 中。

在此处输入图像描述

在图像中,您会看到 4 个滑块,每个滑块都有两个标签和一个按钮。我一直在搞乱 QIcon 和样式表,这就是为什么它们现在看起来有点奇怪。这些对象中的每一个都是在我自己的自定义类中创建的,该类在 QVBoxLayout 中一起生成所有 4 个对象。

我想在每个 QVBoxLayout 周围放置一个边框。我已经翻阅了一页又一页的指南和其他人的代码,但我就是无法弄清楚我在这里做错了什么。我已经设法创建了一个只有黑色边框的 QFrame,它出现在 QVBoxLayout 后面,但无论如何它都没有与它绑定,所以它偏离中心。我可能会使用几何学将某些东西放在一起,但这似乎是我以后会后悔的事情。

在此处输入图像描述

您可以在第二张图片中看到我想要达到的效果,但我所做的一切都不起作用。我才刚刚开始学习编码,所以我现在有点超出我的深度 - 我已经阅读并阅读了 QT 文档和数百个类似于此的留言板问题,但没有任何意义并且没有一个有效。

我知道这将是一件非常简单的事情,但现在我已经准备好把电脑扔出窗外了。

这是我的代码-很抱歉,因为我一直在尝试很多不同的东西,所以有点混乱:

    #!/usr/bin/env python3

import sys

from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *

ON_BTN = 0
ON_PRESS_BTN = 1
OFF_BTN = 2
OFF_PRESS_BTN = 3

MUTE_ICONS = {
    ON_BTN: "./images/onbtn.png",
    ON_PRESS_BTN: "./images/onpressbtn",
    OFF_BTN: "./images/offbtn.png",
    OFF_PRESS_BTN: "./images/offpressbtn.png"
}

slider_enabled = """
    QSlider::groove:vertical {
        height: 300px;
        width: 7px;
        border-radius: 3px;
    }
    QSlider::handle:vertical {
        background: #8d8d8d;
        border: 2px solid #444;
        height: 30px;
        margin: 0 -30px; /* expand outside the groove */
        border-radius: 10px;               
    }

    QSlider::add-page:vertical {
        background: #31b0c3;
        border-radius: 3px;
    }

    QSlider::sub-page:vertical {
        background: black;
        border-radius: 3px;
    } 

    QSlider::handle:vertical:pressed {
        background: #565656;
    }"""

slider_disabled = """ 
    QSlider::groove:vertical {
        height: 300px;
        width: 7px;
        border-radius: 3px;
    }
    QSlider::handle:vertical {
        background: #8d8d8d;
        border: 2px solid #444;
        height: 30px;
        margin: 0 -30px; /* expand outside the groove */
        border-radius: 10px;               
    }

    QSlider::add-page:vertical {
        background: #3d6166;
        border-radius: 3px;
    }

    QSlider::sub-page:vertical {
        background: black;
        border-radius: 3px;
    } 

    QSlider::handle:vertical:pressed {
        background: #565656;
    }"""

class StyleSheets():
    def __init__(self, style):
        self.style = style

    def sliderstyle(self):
        self.style.setStyleSheet

class MySlider(QWidget):
    def __init__(self, number):
        #Defining various items that make up the object
        QWidget.__init__(self)
        self.number = number #Channel number

        #Slider creation and functions that set its value called
        self.slider = QSlider(Qt.Vertical)
        self.slider.setMaximum(100)

        self.send_slider_startup_values()
        self.slider.valueChanged.connect(self.slider_value_change)
        self.slider.setFixedHeight(300)
        self.slider.setFixedWidth(80)
        self.setStyleSheet("background: white;")

        self.MyStylesheet = """
            QSlider::groove:vertical {
                height: 300px;
                width: 7px;
                border-radius: 3px;
            }
            QSlider::handle:vertical {
                background: #8d8d8d;
                border: 2px solid #444;
                height: 30px;
                margin: 0 -30px; /* expand outside the groove */
                border-radius: 10px;               
            }

            QSlider::add-page:vertical {
                background: #00ddff;
                border-radius: 3px;
            }

            QSlider::sub-page:vertical {
                background: black;
                border-radius: 3px;
            } 

            QSlider::handle:vertical:pressed {
                background: #565656;
            }
                """

        self.slider.setStyleSheet(self.MyStylesheet)

        #Defining the channel number label & volume level label
        self.numberlabel = QLabel(str(number))
        self.numberlabel.setAlignment(Qt.AlignCenter)
        self.volumelabel = QLabel("0")
        self.volumelabel.setAlignment(Qt.AlignCenter)
        self.volumelabel.setStyleSheet("border-style: solid; border-color: rgba(0,50,100,255);")

        #Creating the mute button
        self.mutebutton = QPushButton()

        #self.mutebutton.setAlignment(Qt.AlignCenter)
        self.mutebutton.setFixedSize(QSize(int (77), int (45)))
        self.mutebutton.setIconSize(QSize( int(80), int(48)))
        self.mutebutton.setFlat(True)
        self.mutebutton.pressed.connect(self.button_pressed)
        self.mutebutton.released.connect(self.button_released)
        self.update_status(OFF_BTN)

        #Making the Layout and adding each item

        self.sliderframe = QFrame(self)
        self.sliderframe.setFixedHeight(450)
        self.sliderframe.setFixedWidth(90)
        self.sliderframe.setStyleSheet("border: 2px solid black; background: 0%;")
        self.setGeometry(50, 50, 450, 90)



        #sliderflayout = QVBoxLayout()
        #sliderflayout.setAlignment(Qt.AlignCenter)

        sliderlayout = QVBoxLayout()
        sliderlayout.setAlignment(Qt.AlignCenter)

        sliderlayout.addWidget(self.slider, 0, Qt.AlignCenter)
        sliderlayout.addWidget(self.numberlabel, Qt.AlignCenter)
        sliderlayout.addWidget(self.volumelabel, Qt.AlignCenter)
        sliderlayout.addWidget(self.mutebutton, Qt.AlignCenter)
        #sliderlayout.addWidget(self.sliderframe, Qt.AlignCenter)

        #self.sliderframe = QFrame(sliderlayout)
        #self.sliderframe.setFixedHeight(450)
        #self.sliderframe.setFixedWidth(100)
        #self.sliderframe.setStyleSheet("border: 5px solid black;")
        #self.setGeometry(50, 50, 50, 50)
        # self.sliderframe.setVisible(False)

        self.setLayout(sliderlayout)

        #self.setAutoFillBackground(True)


    def slider_value_change(self):
        value = int(self.slider.value() / 10)
        self.volumelabel.setText(str(value))

    def send_slider_startup_values(self):
        self.slider.setValue(0)

    def update_status(self, status):
        self.status = status
        self.mutebutton.setIcon(QIcon(MUTE_ICONS[self.status]))

    def button_pressed(self):
        if self.status == ON_BTN:
            self.update_status(ON_PRESS_BTN)

        elif self.status == OFF_BTN:
            self.update_status(OFF_PRESS_BTN)

    def button_released(self):
        if self.status == ON_PRESS_BTN:
            self.send_mute()
            self.slider.setStyleSheet(slider_disabled)
            self.update_status(OFF_BTN)

        elif self.status == OFF_PRESS_BTN:
            self.send_mute()
            self.slider.setStyleSheet(slider_enabled)
            self.update_status(ON_BTN)

    def send_mute(self):
        pass


class Window2(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Hello")
        self.setMinimumHeight(480)
        self.setMinimumWidth(800)
        self.setAutoFillBackground(True)
        self.setStyleSheet("""QWidget{background-color: grey;}""")

        self.labeltest = QLabel("test")

        label = QLabel("Test 1")
        label2 = QLabel("Test 2")
        label3 = QLabel("Test 3")
        label4 = QLabel("Test 4")
        label5 = QLabel("Test 5")

        radiobutton = QRadioButton("MUTE")
        radiobutton.setText("hello")

        #self.label5 = QLabel("HELLO!!!!!")
        #frame = QFrame()
        #frame.setLayout(QVBoxLayout)


        self.channel1 = MySlider(1)
        self.channel2 = MySlider(2)
        self.channel3 = MySlider(3)
        self.channel4 = MySlider(4)

        #self.sliderframe = QFrame(self.channel1)
        #self.sliderframe.setFixedHeight(500)
        #self.sliderframe.setFixedWidth(150)
        #self.sliderframe.setStyleSheet("border: 2px solid black; background: 0%;")


        self.channel2.setDisabled(True)

        layout = QHBoxLayout()
        layout.setAlignment(Qt.AlignLeft)

        layout.addWidget(self.channel1)
        layout.addWidget(self.channel2)
        layout.addWidget(self.channel3)
        layout.addWidget(self.channel4)

        self.setLayout(layout)



    def password_timeout(self):
        pass

    #def frame_object(self, channel):
        #frame = QFrame()
        #frame.setStyleSheet("""
        #QFrame::active: {
        #    background: white;
        #}""")
        #channelstrip = MySlider(channel)
        #frame.setLayout(channelstrip)
        #return frame




class PasswordWindow(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Password Test")
        self.showFullScreen()

        layout = QGridLayout()
        self.setLayout(layout)
        label = QLabel("Please enter password: ")
        layout.addWidget(label, 0, 0)

        button = QPushButton("Press me!")
        button.clicked.connect(self.button_pushed)
        layout.addWidget(button, 1, 0)

    def button_pushed(self):
        self.close()



app = QApplication(sys.argv)

mainwindow = Window2()
mainwindow.show()

sys.exit(app.exec_())

编辑:轻微更新,我设法通过创建一个单独的类来构建对象,该类继承 Qframe 并将 MySlider 对象传递给它。我需要找到一种方法让它在物体周围更紧密,但它的进步有些。

更新的滑块

4

1 回答 1

0

我已经想通了。我正在写一个回复,以防其他人遇到同样的问题(因为这似乎很常见)。布局自动带有边距和填充。将填充和边距设置为您想要的命令是:

layoutname.setContentsMargins(0, 0, 0, 0)
layoutname.setSpacing(0)

所以我以为我是用 QFrames 来做这个的,但我并没有意外地让它工作。您可以通过创建一个将自定义对象传递到其中的小部件类并使用样式表来为整个事物设置边框来做到这一点。您还可以获得样式表不影响传递给它的对象的好处,因为它只关心它写入的类。所以在我的例子中,我创建了一个名为“MySlider”的对象类,它产生 4 个对象 - 一个 QSlider,2 个 QLabels , 和一个 QPushbutton。这被认为是一个单一的对象,因为它是在一个类中制作的。然后我创建了第二个需要参数的类。我将新创建的对象作为参数传递给第二个类,并将其添加到另一个 QVBoxLayout。然后使用 self.setStyleSheet 我可以编辑整个小部件元素。小部件将自动调整到最小的大小,而无需裁剪其内容。这是代码,它非常简单,但人确实扭曲了我的甜瓜:

class SliderFrame(QFrame):
def __init__(self, myslider):
    QFrame.__init__(self)

    self.setStyleSheet("border: 1px solid black; margin: 0px; padding: 0px;")

    self.layout = QVBoxLayout()
    self.layout.addWidget(myslider)
    self.layout.setContentsMargins(0, 0, 0, 0)

    self.setLayout(self.layout)

在主窗口上创建对象时:

self.channel1 = SliderFrame(MySlider(1))

您可以看到我将参数传递给 SliderFrame,然后将参数传递给 MySlider。

完毕!

于 2020-05-24T13:06:52.767 回答