Использование QFrames в QT для Python? - PullRequest
2 голосов
/ 26 мая 2020

как размещать объекты в пределах QFrame, так как я не могу обойти это. Я читал документацию по https://doc.qt.io/qtforpython/PySide2/QtWidgets/QFrame.html, но она мне не подходит. Я также просмотрел различные фрагменты кода, но, похоже, ничего не делает то, что я хочу.

Когда я пытаюсь вызвать методы QPushButton или QFrame, похоже, нет вариантов для взаимодействия друг с другом.

from PySide2.QtWidgets import *
import sys

class ButtonTest(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.button1 = QPushButton("Button 1")
        self.button2 = QPushButton("Button 2")

        self.myframe = QFrame()
        self.myframe.setFrameShape(QFrame.StyledPanel)
        self.myframe.setFrameShadow(QFrame.Plain)
        self.myframe.setLineWidth(3)

        self.buttonlayout = QVBoxLayout(self.myframe)
        self.buttonlayout.addWidget(self.button1)
        self.buttonlayout.addWidget(self.button2)

        self.setLayout(self.buttonlayout)


app = QApplication(sys.argv)

mainwindow = ButtonTest()
mainwindow.show()

sys.exit(app.exec_())

Они передают QFrame в качестве аргумента при построении макета. Компилируется нормально, но кадра нигде не видно.

1 Ответ

3 голосов
/ 26 мая 2020

Проблема проста: макет может быть установлен только в виджете, чтобы лучше понять, вы должны знать, что:

lay = QXLayout(foowidet)

равно:

lay = QXLayout()
foowidget.setLayout(lay)

В вашем коде сначала вы указали, что buttonlayout обрабатывает дочерние виджеты myframe (self.buttonlayout = QVBoxLayout(self.myframe)), но затем вы установили его для обработки дочерних элементов окна (self.addWidget(self.myframe).

Решение состоит в том, чтобы установить sh QFrame через макет:

class ButtonTest(QWidget):
    def __init__(self):
        super(ButtonTest, self).__init__()

        self.button1 = QPushButton("Button 1")
        self.button2 = QPushButton("Button 2")

        self.myframe = QFrame()
        self.myframe.setFrameShape(QFrame.StyledPanel)
        self.myframe.setFrameShadow(QFrame.Plain)
        self.myframe.setLineWidth(3)

        buttonlayout = QVBoxLayout(self.myframe)
        buttonlayout.addWidget(self.button1)
        buttonlayout.addWidget(self.button2)

        lay = QVBoxLayout(self)
        lay.addWidget(self.myframe)
...