Почему мои метки накладываются друг на друга внутри моего QHBoxLayout? - PullRequest
2 голосов
/ 26 сентября 2019

Достаточно просто, я хочу добавить две метки в горизонтальном макете блока, используя Python PYQT5.

Когда я выполняю этот код, две метки появляются друг над другом, даже если они добавляются в QHBoxLayoutследует расположить их слева направо.

Как это исправить?

  • Компилятор: Python 3.7.4 32-битный
  • IDE: код Visual Studio
  • ОС: Windows 10

мой код:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class Interface(QMainWindow):
    def __init__(self):
        super().__init__()

        self.title = 'debug'
        self.mainLayout = QHBoxLayout()
        self.initGUI()

    def initGUI(self):
        self.setGeometry(0,0,200,200)
        self.setFixedSize(self.size())
        self.setWindowTitle(self.title)

        label1 = QLabel('test 1',self)
        label2 = QLabel('test 2',self)
        self.mainLayout.addWidget(label1)
        self.mainLayout.addWidget(label2)

        self.setLayout(self.mainLayout)
        self.show()    

    def close_application(self):
        sys.exit()

if __name__ == '__main__':
    app = QApplication([])
    window = Interface()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 26 сентября 2019

Объяснение:

QMainWindow - это специальный виджет с макетом по умолчанию:

enter image description here

, который не позволяет установить другоймакет и четко указывает на сообщение об ошибке, которое получается при выполнении вашего кода в терминале / CMD:

QWidget::setLayout: Attempting to set QLayout "" on Interface "", which already has a layout

Так что, когда макет не установлен, он не обрабатывает положение QLabels, и вы,при переходе в качестве родителя к окну - self, оба будут установлены в окне в верхнем левом положении.

Решение:

Как Документы ТочкиВы должны создать центральный виджет, который используется в качестве контейнера, а затем установить макет:

def initGUI(self):
    self.setGeometry(0,0,200,200)
    self.setFixedSize(self.size())
    self.setWindowTitle(self.title)

    central_widget = QWidget() # <---
    self.setCentralWidget(central_widget) # <---

    label1 = QLabel('test 1')
    label2 = QLabel('test 2')
    self.mainLayout.addWidget(label1)
    self.mainLayout.addWidget(label2)

    central_widget.setLayout(self.mainLayout) # <---
    self.show()    
...