QMdiArea показывает неправильно

У меня проблема при использовании QMdiArea в PyQt5, вот что я сделал:

  1. Я создаю демонстрационный пользовательский интерфейс с дизайнером Qt, который выглядит так: введите здесь описание изображения

  2. Когда я просматриваю его в дизайнере Qt, он выглядит нормально: введите здесь описание изображения

  3. Однако когда я использую pyqt5_uic для преобразования файла .ui в файл .py и запускаю код, это выглядит так: введите здесь описание изображения

Я обнаружил, что соответствующий код .py, сгенерированный с помощью инструментов uic, не может установить родителя для подокна в mdiarea:

self.mdiArea = QtWidgets.QMdiArea(IOWidgets)
        self.mdiArea.setGeometry(QtCore.QRect(555, 120, 421, 181))
        self.mdiArea.setObjectName("mdiArea")
        self.subwindow = QtWidgets.QWidget()
        self.subwindow.setObjectName("subwindow")
        self.lineEdit_1_IO = QtWidgets.QLineEdit(self.subwindow)
        self.lineEdit_1_IO.setGeometry(QtCore.QRect(20, 20, 61, 21))
        self.lineEdit_1_IO.setObjectName("lineEdit_1_IO")
        self.spinBox_1_IO = QtWidgets.QSpinBox(self.subwindow)
        self.spinBox_1_IO.setGeometry(QtCore.QRect(30, 60, 42, 22))
        self.spinBox_1_IO.setObjectName("spinBox_1_IO")

если я изменю код критической строки на:

self.subwindow = QtWidgets.QWidget(self.mdiArea)

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


вот простая демонстрация:

  1. код .py, созданный с помощью инструментов uic, — это Ui_Mdi_simple.py:
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MDI_test(object):
    def setupUi(self, MDI_test):
        MDI_test.setObjectName("MDI_test")
        MDI_test.resize(545, 336)
        self.mdiArea = QtWidgets.QMdiArea(MDI_test)
        self.mdiArea.setGeometry(QtCore.QRect(70, 50, 331, 221))
        self.mdiArea.setObjectName("mdiArea")
        self.subwindow = QtWidgets.QWidget()
        self.subwindow.setObjectName("subwindow")
        self.comboBox = QtWidgets.QComboBox(self.subwindow)
        self.comboBox.setGeometry(QtCore.QRect(50, 30, 68, 22))
        self.comboBox.setObjectName("comboBox")
        self.lineEdit = QtWidgets.QLineEdit(self.subwindow)
        self.lineEdit.setGeometry(QtCore.QRect(50, 70, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.radioButton = QtWidgets.QRadioButton(self.subwindow)
        self.radioButton.setGeometry(QtCore.QRect(50, 110, 95, 20))
        self.radioButton.setObjectName("radioButton")
        self.subwindow_2 = QtWidgets.QWidget()
        self.subwindow_2.setObjectName("subwindow_2")

        self.retranslateUi(MDI_test)
        QtCore.QMetaObject.connectSlotsByName(MDI_test)

    def retranslateUi(self, MDI_test):
        _translate = QtCore.QCoreApplication.translate
        MDI_test.setWindowTitle(_translate("MDI_test", "Form"))
        self.subwindow.setWindowTitle(_translate("MDI_test", "subwindow_1"))
        self.radioButton.setText(_translate("MDI_test", "RadioButton"))
        self.subwindow_2.setWindowTitle(_translate("MDI_test", "subwindow_2"))
  1. основной код:

import sys
from PyQt5.QtWidgets import QWidget, QApplication
from Ui_Mdi_simple import Ui_MDI_test


class MDI_demo(QWidget, Ui_MDI_test):
    def __init__(self):
        super().__init__()
        self.setupUi(self)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MDI_demo()
    win.show()
    sys.exit(app.exec_())

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


person bactone    schedule 05.05.2021    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 05.05.2021
comment
Прочтите Как спросить и укажите MRE в своем сообщении в виде текста.   -  person eyllanesc    schedule 05.05.2021


Ответы (1)


Я обнаружил, что добавление следующих двух строк кода в Ui_MDI_test решает проблему:

self.mdiArea.addSubWindow(self.subwindow)
self.mdiArea.addSubWindow(self.subwindow_2)

@eyllanesc, спасибо.

person bactone    schedule 05.05.2021