QMdiArea 显示不正确

问题描述

我在 PyQt5 中使用 qmdiarea 时遇到问题,以下是我所做的:

  1. 我用 Qt 设计器创建了一个演示 UI,看起来像:

    enter image description here

  2. 当我在 Qt 设计器中预览时,它看起来不错:

    enter image description here

  3. 但是,当我使用 pyqt5_uic 将 .ui 文件转换为 .py 文件并运行代码时,它看起来像这样:

    enter image description here

我发现使用uic工具生成的相应.py代码无法为mdiaarea中的子窗口设置父级:

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)

然后我可以看到mdiaarea中的子窗口,但看起来很奇怪:

enter image description here


这是一个简单的演示:

  1. 使用 uic 工具生成的 .py 代码是 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_())

结果是:

enter image description here

解决方法

我发现在 Ui_MDI_test 中添加以下两行代码可以解决问题:

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

@eyllanesc,谢谢。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...