Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
394 views
in Technique[技术] by (71.8m points)

python - Create a widget to embed into QMainWindow

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:

enter image description here

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.

enter image description here

enter image description here

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.

enter image description here

  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)

enter image description here

  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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...