Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)

在实际项目开发中,可能存在需要将自定义的widget嵌入到某一窗口的情况,或者为维护简洁方便,将一个大的UI文件拆分为多个独立的UI文件进行管理。这时就存在不同窗口的ui文件进行嵌套。

以widget控件为例,对实现过程进行记录,类间关系如下:

Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)_第1张图片

主窗口为自己编写的MainWindow类,其使用 Qt Designer设计的MainWindow_ui.py文件,实现主窗口ui界面控件。在Ui_MainWindow类中嵌入自己编写的PyechartWidget类作为自定义控件,控件的ui使用Qt Designer设计的pyechartWidget_ui.py文件实现。

首先在Qt Designer中建立一个主窗口,命名为MainWindow,保存为MainWindow.ui文件。

Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)_第2张图片

 右键选择centeralwidget对象,点击“提升为。。。”命令

 在弹出的窗口中,基类名称选择QWidget(即需要嵌入的控件类型),提升的类名称填写PyechartWidget.py文件中编译生成的类名,头文件填写pyechartWidget.py文件的文件名,注意要省略.py,只填写文件名即可,然后点击“添加”和“提升”。将MainWindow编译为MainWindow_ui.py文件。

Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)_第3张图片

再新建一个ui文件,文件类别选择widget,命名为pyechart_Widget。

Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)_第4张图片

 在控件中添加一个添加一个QWebEngineView控件,和一个label,然后保存编译为pyechartWidget_ui.py文件。

Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)_第5张图片

  使用vscode编写主函数,需要import主窗口的Ui_MainWindow类代码如下:

import sys
from PySide6.QtWidgets import QApplication,QMainWindow
from MainWindow_ui import Ui_MainWindow

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()     #创建MainWindow对象
        self.ui.setupUi(self)         #调用MainWindow的setupUi函数,创建ui控件

if __name__ == "__main__":
    app = QApplication(sys.argv)

    mainWindow = MainWindow()       #创建主窗口
    mainWindow.show()               #显示主窗口

    sys.exit(app.exec())

 MainWindow_ui.py文件代码如下:

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'MainWindow.ui'
##
## Created by: Qt User Interface Compiler version 6.4.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QMainWindow, QSizePolicy, QWidget)

from pyechartWidget import PyechartWidget

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = PyechartWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
    # retranslateUi

自定义pyechartWidget.py文件如下:

from PySide6.QtWidgets import QWidget
from pyechartWidget_ui import Ui_pyechart_Widget

class PyechartWidget(QWidget):
    def __init__(self,parent):
        super().__init__()
        self.ui = Ui_pyechart_Widget()
        self.ui.setupUi(self)

自动生成的 pyechartWidget_ui.py文件如下:

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'pyechartWidget.ui'
##
## Created by: Qt User Interface Compiler version 6.4.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import (QApplication, QLabel, QSizePolicy, QVBoxLayout,
    QWidget)

class Ui_pyechart_Widget(object):
    def setupUi(self, pyechart_Widget):
        if not pyechart_Widget.objectName():
            pyechart_Widget.setObjectName(u"pyechart_Widget")
        pyechart_Widget.resize(838, 713)
        self.verticalLayout = QVBoxLayout(pyechart_Widget)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.webEngineView = QWebEngineView(pyechart_Widget)
        self.webEngineView.setObjectName(u"webEngineView")
        self.webEngineView.setUrl(QUrl(u"about:blank"))

        self.verticalLayout.addWidget(self.webEngineView)

        self.label = QLabel(pyechart_Widget)
        self.label.setObjectName(u"label")

        self.verticalLayout.addWidget(self.label)


        self.retranslateUi(pyechart_Widget)

        QMetaObject.connectSlotsByName(pyechart_Widget)
    # setupUi

    def retranslateUi(self, pyechart_Widget):
        pyechart_Widget.setWindowTitle(QCoreApplication.translate("pyechart_Widget", u"Form", None))
        self.label.setText(QCoreApplication.translate("pyechart_Widget", u"\u8fd9\u65f6\u81ea\u5b9a\u4e49\u7684widget", None))
    # retranslateUi

运行主函数,即可看到自定义控件的嵌入,使用此种方法可以实现UI文件和控制文件的分离。

Pyside6实现自定义widget嵌套(自定义widget为独立ui文件)_第6张图片

你可能感兴趣的:(python,ui,pyqt)