Добавление QVBoxLayout в QFrame?

2
Welshhobo 2020-05-24 22:48.

Я пытаюсь понять, как добавить заполненный QVBoxLayout в QFrame.

На изображении вы видите 4 ползунка, каждый с двумя метками, и кнопку. Я возился с QIcon и таблицами стилей, поэтому сейчас они выглядят немного странно. Каждый из этих объектов создается в моем собственном пользовательском классе, который создает все 4 объекта вместе в QVBoxLayout.

Я хотел бы поместить границу вокруг каждого 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. Мне нужно найти способ сделать его более плотным вокруг объектов, но он несколько прогрессирует.

1 answers

0
Welshhobo 2020-05-25 03:06.

Я понял это. Я пишу ответ на случай, если кто-то еще столкнется с той же проблемой (поскольку она кажется довольно распространенной). Макеты поставляются автоматически с полями и отступами. Команда для установки отступов и полей такими, какими вы хотите их видеть:

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.

Related questions

MORE COOL STUFF

Яна Дуггар: все, что она говорила о любви и ее 5-летнем окне, чтобы найти «того самого»

Яна Дуггар: все, что она говорила о любви и ее 5-летнем окне, чтобы найти «того самого»

Яна Дуггар открыто говорила о своих поисках любви. Вот все, что она сказала на эту тему и о своем пятилетнем окне для замужества.

Сэм Хьюэн точно знает, что он возьмет из съемочной площадки «Чужестранки»: «Я чувствую себя Джейми, когда надеваю их»

Сэм Хьюэн точно знает, что он возьмет из съемочной площадки «Чужестранки»: «Я чувствую себя Джейми, когда надеваю их»

Звезда «Чужестранки» Сэм Хьюэн недавно рассказал, что он возьмет со съемочной площадки, чтобы вспомнить Джейми Фрейзера, роль, которая сделала его звездой.

Ранняя песня Beatles, которая вошла в число «самых захватывающих выступлений» группы, по мнению инсайдера Fab Four

Ранняя песня Beatles, которая вошла в число «самых захватывающих выступлений» группы, по мнению инсайдера Fab Four

«She Loves You» была написана за час, записана за день и стала песней The Beatles с одним из лучших исполнений в их карьере.

Долли Партон помогла своей «инвалидной» бабушке, когда ни один из других внуков не стал бы — она тоже разыгрывала ее

Долли Партон помогла своей «инвалидной» бабушке, когда ни один из других внуков не стал бы — она тоже разыгрывала ее

У Долли Партон и ее бабушки Бесси были особые отношения. Бабушка Партон была очень больна, но это не мешало Долли разыгрывать ее.

Какая древесина самая твёрдая в мире?

Какая древесина самая твёрдая в мире?

Вы можете подумать, что дуб или гикори — прочные породы дерева, но когда речь идет о самой твердой древесине в мире, они даже близко не стоят.

10 самых страшных морских существ, скрывающихся в глубинах океана

10 самых страшных морских существ, скрывающихся в глубинах океана

Океан полон красоты, но он также скрывает одних из самых страшных морских существ на планете. Многие из этих животных скрываются глубоко под поверхностью океана, в тёмном, полном давления мире морских глубин.

10 лучших чар для мечей в Minecraft

10 лучших чар для мечей в Minecraft

Если вы сражаетесь с враждебными мобами или готовитесь к PvP-боям, знание лучших чар для мечей в Minecraft может дать вам серьёзное преимущество. Зачарование мечей позволяет наносить больше урона, увеличивать количество выпадающих мобов и продлевать срок службы меча.

13 социалистических стран, которые сильно отличаются друг от друга

13 социалистических стран, которые сильно отличаются друг от друга

Когда говорят о социалистических странах, часто представляют себе полный государственный контроль и отсутствие частной собственности. Но на практике социалистические экономики сильно различаются.

Резюме «Медведя»: Маркус — самый добрый, мягкий и искренний человек в Чикаго?

Резюме «Медведя»: Маркус — самый добрый, мягкий и искренний человек в Чикаго?

В «Детях» появится громкая камео и несколько разрушительных новостей

За 9800 долларов вы бы упаковали их в эту семиместную Toyota RAV4 2008 года выпуска?

За 9800 долларов вы бы упаковали их в эту семиместную Toyota RAV4 2008 года выпуска?

Утверждается, что этот RAV4 находится в отличном состоянии и готов к игре в музыкальные стулья.

Фургон доставки Amazon загорелся в результате огненного взрыва во время летней жары в Хьюстоне

Фургон доставки Amazon загорелся в результате огненного взрыва во время летней жары в Хьюстоне

На кадрах, снятых с дрона, видно, как пожарные изо всех сил пытаются потушить пламя.

«Шоу Черной Пантеры» от Marvel станет самым важным анимационным шоу за всю историю

«Шоу Черной Пантеры» от Marvel станет самым важным анимационным шоу за всю историю

«Глаза Ваканды» напрямую связаны с MCU, а также обновления о «Людях Икс '97», «Что, если...», «Сорвиголова» и многом другом.

История знакомств Авы Гарднер: взгляд назад на браки и романы голливудской иконы

История знакомств Авы Гарднер: взгляд назад на браки и романы голливудской иконы

Ава Гарднер была замужем за Микки Руни и Фрэнком Синтрой, и встречалась с несколькими другими голливудскими звездами. Вот взгляд назад на историю знакомств Авы Гарднер.

Кто жена Джона Клиза? Все о Дженнифер Уэйд

Кто жена Джона Клиза? Все о Дженнифер Уэйд

Джон Клиз женился на Дженнифер Уэйд в 2012 году. Вот все, что нужно знать о жене Джона Клиза, Дженнифер Уэйд.

Кто муж Эллисон Феликс? Все о Кеннете Фергюсоне

Кто муж Эллисон Феликс? Все о Кеннете Фергюсоне

Олимпийская чемпионка Эллисон Феликс вышла замуж за своего мужа Кеннета Фергюсона в 2018 году. Вот все, что нужно знать о муже Эллисон Феликс, Кеннете Фергюсоне.

Кто муж Мены Сувари? Все о Майкле Хоупе

Кто муж Мены Сувари? Все о Майкле Хоупе

Мена Сувари замужем за своим мужем Майклом Хоупом с 2018 года. Вот все, что нужно знать о муже Мены Сувари.

местоимения очень страшные

Это поражает меня Внезапно, как это часто бывает, Это снова и снова на полпути <Нет, не то, что в Тихом океане, ты темно-бордовый, то, что на карнавале> Каждый громкий заголовок…..

3 проверенных способа улучшить свои навыки письма

Преимущества письма и стратегии, которые помогут вам в этом

3 проверенных способа улучшить свои навыки письма

В 2022 году, с выпуском GPT-3, навыки письма, кажется, стали менее важными. С помощью ИИ люди с плохим письмом также могут генерировать качественный персонал.

Медленная эрозия: раскрытие того, как люди угасают в своей карьере

Медленная эрозия: раскрытие того, как люди угасают в своей карьере

В современном быстро меняющемся и конкурентном мире карьера играет важную роль в личностном росте, финансовой стабильности и общей удовлетворенности жизнью. Однако многие люди оказываются в безжалостном цикле застоя и неудовлетворенности, постепенно угасая в своей профессиональной жизни.

Что делает подкаст влиятельным?

Что делает подкаст влиятельным?

На прошлой неделе я заметил пресс-релиз, разосланный через PressGazette (новостной веб-сайт британских СМИ). В статье сообщалось, что Acast, скандинавская компания по размещению и рекламе подкастов, возглавит консорциум «вероятно, самых влиятельных» издателей подкастинга.

Language