创建要嵌入到 QMainWindow 中的小部件
问题描述
我有这个我还不能解决的任务.使用 PyQt 和 Qt Creator.
我想将在 QT Creator 中创建的自定义小部件嵌入到另一个 QMainWindow 中.
1) 我做的步骤:
在 QT creator 中创建一个 Widget 文件:
2) 将其保存为 *.ui 并应用此行将其转换为 *.py 文件:
pyuic5 gen_settings.ui -o gen_settings.py
3) 打开它,看到它以
开头从 PyQt5 导入 QtCore、QtGui、QtWidgets类 Ui_gen_settings(对象):def setupUi(self, gen_settings):gen_settings.setObjectName("gen_settings")
4) 当然会导致函数调用:
TypeError:参数不匹配任何重载调用:addWidget(self, QWidget): 参数 1 具有意外类型函数"
当我在另一个 QMainWindow 文件中调用它时:
类 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,所以我们必须
- 将出现以下对话框并填写如图所示的字段(我假设 gen_settings_ui.py 和 gen_settings.py 与当前 .ui 位于同一文件夹中)
- 您按下添加按钮,然后按下升级按钮.
<小时>
然后你用 pyuic 将 .ui 转换为 .py ,你会得到以下结果:
从 PyQt5 导入 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:
- Right click on the widget container and select the
Promote To ...
option.
- 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)
- 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
相关文章