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

标签 python pyqt pyqt5 qt-designer

我有这个任务还无法解决。使用 PyQt 和 Qt Creator。

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

1)我所做的步骤:

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

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)

有什么想法可以解决吗?

最佳答案

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

说到问题,Qt Designer 不提供小部件,而是提供一个充当小部件接口(interface)的类,这可以在他的声明中看到:

class Ui_gen_settings(object):
    # ...

该类继承自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

图中,Widget容器是左上角的容器,现在我们将其替换为Gen_Settings,所以我们必须promote它使用以下过程:

  1. 右键单击小部件容器并选择升级到...选项。

enter image description here

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

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

  • 然后使用 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
    

    关于python - 创建一个小部件嵌入到 QMainWindow 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53544446/

    相关文章:

    python - ValueError : Error when checking target: expected activation_7 to have shape (154, 154, 1) 但得到形状为 (200, 200, 3) 的数组

    python - 如何在数据更新时自动刷新pyqt5表

    python - 在 PyQt 中,QTextEdit.setTextColor() 在移动光标之前不起作用

    python - 如何使用 QAbstractTableModel 控制 QTableView 的 Header

    python - 按钮如何删除它所在的 QTableWidget 中的一行

    python - 如何使用 QThread 在 GUI 不卡住的情况下查看文件下载进度(python 3.4,pyQt5)

    python - 如何在不更改原始数组的情况下操作数组的副本?

    python - 如何访问Python字典

    python - 带有值的 Django foo_display()

    windows - 在Windows上将QMediaPlayer与PyQt5一起使用时出错