创建一个小部件以嵌入 QMainWindow [英] Create a widget to embed into QMainWindow

查看:46
本文介绍了创建一个小部件以嵌入 QMainWindow的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个任务我还没有解决.使用 PyQt 和 Qt Creator.

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

1) 我要做的步骤:

在 QT creator 中创建一个 Widget 文件:

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

pyuic5 gen_settings.ui -o gen_settings.py

3) 打开它,看到它以

开头

from PyQt5 import QtCore, QtGui, QtWidgets类 Ui_gen_settings(object):def setupUi(self, gen_settings):gen_settings.setObjectName("gen_settings")

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

TypeError: 参数不匹配任何重载调用:addWidget(self, QWidget): 参数 1 有意外的类型函数"

当我在另一个 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)

任何想法如何解决它?

解决方案

首先我推荐你阅读

图中左上角的那个是Widget容器,现在我们要替换成Gen_Settings,所以必须

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

  1. 您按下添加"按钮,然后按下提升"按钮.

<小时>

然后使用 pyuic 将 .ui 转换为 .py,您将得到以下内容:

from PyQt5 import QtCore, QtGui, QtWidgets类 Ui_MainWindow(对象):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)# ...从 gen_settings 导入 Gen_Settings

I have this task that I couldn't solve yet. Working with PyQt and Qt Creator.

I want to embed a custom created widget created in QT Creator into another QMainWindow.

1) Steps I do:

Create a Widget file in QT creator:

2) Save it as *.ui and apply this line to convert it to a *.py file:

pyuic5 gen_settings.ui -o gen_settings.py

3) Open it and see that it starts with

from PyQt5 import QtCore, QtGui, QtWidgets

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

4) Which results in function call of course:

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

when I call it in another QMainWindow file:

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

Any ideas how to solve it?

解决方案

First of all I recommend you read the PyQt docs referring to Qt Designer.

Going to the problem, Qt Designer does not provide a widget but a class that serves as an interface to a widget, and that can be seen in his statement:

class Ui_gen_settings(object):
    # ...

The class inherits from object and not from QWidget, QDialog, QMainWindow, etc.

In the docs that indicate initially it is recommended to create a widget and use the interface provided by Qt Designer. For this it is correct to use pyuic but I will change the gen_settings.py to gen_settings_ui.py so that the change is understood.

pyuic5 gen_settings.ui -o gen_settings_ui.py

So now we create a file called gen_settings.py that contains the widget and use the interface.

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)


Then when you create the .ui corresponding to Ui_MainWindow you add a QWidget that is an empty container.

In the image, the Widget container is the one in the upper left, and now we will replace it with Gen_Settings, so we must promote it using the following procedure:

  1. Right click on the widget container and select the Promote To ... option.

  1. The following Dialog will appear and fill in the fields as shown in the image (I'm assuming that gen_settings_ui.py and gen_settings.py are in the same folder as the current .ui)

  1. You press the Add button and then the Promote button.


Then you convert the .ui to .py with pyuic and you will get the following:

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

这篇关于创建一个小部件以嵌入 QMainWindow的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆