PyQt5 добавляет пользовательский 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))

Я удалил сигналы и щели между слайдером и ЖК-экраном, потому что здесь меня не беспокоит функциональность. Только тот факт, что я получаю серую область 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 в центральном виджете. Виджеты с двумя кнопками w1 и w3 появляются, но мой пользовательский виджет не отображается, а увеличение размера виджета с помощью setMinimumSize только добавляет серые интервалы между w1 и w3.

Так что виджет есть, его просто почему-то не видно. Я новичок в PyQt, поэтому объясните, почему это произошло.


person Max    schedule 15.04.2016    source источник


Ответы (1)


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)
person Brendan Abel    schedule 15.04.2016