创建一个小部件以嵌入到QMainWindow中

时间:2018-11-29 17:22:44

标签: python pyqt pyqt5 qt-designer

我有尚未解决的任务。与PyQt和Qt Creator合作。

我想将在QT Creator中创建的自定义创建的小部件嵌入另一个QMainWindow中。

1)我要做的步骤:

在QT创建者中创建窗口小部件文件:

enter image description here

2)将其另存为* .ui并应用此行将其转换为* .py文件:

pyuic5 gen_settings.ui -o gen_settings.py

3)打开它,看它以

开头
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_gen_settings(object):
    def setupUi(self, gen_settings):
        gen_settings.setObjectName("gen_settings")

4)当然会导致函数调用:

TypeError: arguments did not match any overloaded call:
  addWidget(self, QWidget): argument 1 has unexpected type 'function'

当我在另一个QMainWindow文件中调用它时:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow, My_Custom_widget):
        MainWindow.setObjectName("MainWindow")
        self.gridLayout.addWidget(My_Custom_widget, 1, 4, 1, 1)

任何想法如何解决?

1 个答案:

答案 0 :(得分:3)

首先,我建议您阅读the PyQt docs referring to Qt Designer

要解决这个问题,Qt Designer不提供小部件,而是提供一个类作为小部件的接口,可以从他的声明中看到:

class Ui_gen_settings(object):
    # ...

该类继承自对象,而不继承自QWidget,QDialog,QMainWindow等。

在最初指示文档的文档中,建议创建一个窗口小部件并使用Qt Designer提供的界面。为此,使用pyuic是正确的,但是我将gen_settings.py更改为gen_settings_ui.py以便了解更改。

pyuic5 gen_settings.ui -o gen_settings_ui.py

所以现在我们创建一个名为gen_settings.py的文件,其中包含该小部件并使用该界面。

gen_settings.py

from gen_settings_ui import Ui_gen_settings
from PyQt5 import QtWidgets


class Gen_Settings(QtWidgets.QWidget, Ui_gen_settings):
    def __init__(self, parent=None):
        super(Gen_Settings, self).__init__(parent)
        self.setupUi(self)

然后,当您创建与Ui_MainWindow对应的.ui时,将添加一个作为空容器的QWidget。

enter image description here

enter image description here

在图像中,小部件容器是左上角的容器,现在我们将其替换为Gen_Settings,因此我们必须使用以下过程promote对其进行

  1. 右键单击小部件容器,然后选择Promote To ...选项。

enter image description here

  1. 将出现以下对话框,并填充图像中所示的字段(我假设gen_settings_ui.py和gen_settings.py与当前.ui位于同一文件夹中)

enter image description here

  1. 您按“添加”按钮,然后按“升级”按钮。

然后使用pyuic将.ui转换为.py,您将获得以下信息:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        # ...
        self.widget = Gen_Settings(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)
        # ...

from gen_settings import Gen_Settings