PyQt5将自定义QWidget添加到QLayout

时间:2016-04-15 18:16:35

标签: python qt pyqt qwidget qlayout

目前我正在尝试将自定义QWidget类添加到QVBoxLayout。我得到的问题是小部件在布局中根本不出现。我甚至尝试设置QWidget的最小大小,因为我认为小部件没有显示,因为它的默认大小设置为零。

这是对类的简化:

class myWidget(QWidget):

    def __init__(self):
        super().__init__()

        # Slider
        self.mySlider = QSlider(Qt.Horizontal)
        self.mySlider.setRange(-360, 360)

        # LCD Screen
        self.lcd = QLCDNumber()
        self.lcd.setMinimumHeight(45)
        self.lcd.setMaximumHeight(75)

        # set Size
        self.setMinimumSize(QSize(400,300))

我删除了滑块和LCD屏幕之间的信号和插槽,因为我不担心这里的功能。只有我在以下代码中的两个按钮之间直接得到QSize(400,300)的灰色区域这一事实:

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        #Create Widgets to be Added to Central Widget
        self.w1 = QPushButton("First")
        self.w2 = myWidget()
        self.w3 = QPushButton("Third")

        #Set Central Widget and VBox
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        #Add widgets
        self.layout.addWidget(self.w1)
        self.layout.addWidget(self.w2)
        self.layout.addWidget(self.w3)

所以我正在做的就是创建3个小部件,并将它们放入中央小部件中的QVBoxLayout。出现了2个按钮小部件w1w3,但我的自定义小部件未显示,并且通过setMinimumSize增加小部件的大小只会在w1和{{之间添加灰色间距1}}。

因此小部件就在那里因某种原因不可见。我对PyQt很新,所以请解释为什么会发生这种情况。

1 个答案:

答案 0 :(得分:4)

QWidgets只是其他小部件的容器。没有任何布局和子窗口小部件QWidget看起来就像空格,除非您正在进行一些自定义绘画或样式。

在您的示例中,您实际上并未向自定义窗口小部件添加任何子窗口小部件。为了将子窗口小部件添加到另一个窗口小部件,您需要设置子窗口小部件的父窗口,或者将子窗口小部件添加到父窗口小部件的布局(自动重新父窗口小部件)

class myWidget(QWidget):

    def __init__(self):
        super().__init__()

        # Slider
        self.mySlider = QSlider(Qt.Horizontal)

在这里,您要创建一个QSlider,但它实际上并不属于MyWidget,它最终将归Qt所有,我希望它会被提取主窗口的左上角。

为了使其成为MyWidget的子窗口小部件,您需要设置父窗口并将其添加到布局中。

class myWidget(QWidget):

    def __init__(self):
        super().__init__()

        self.myLay = QVBoxLayout()
        self.setLayout(self.myLay)

        # Notice self is being passed in to set the parent
        self.mySlider = QSlider(Qt.Horizontal, self)

        # You need to add widgets to a layout to position them properly
        self.myLay.addWidget(self.mySlider)