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

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

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

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

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

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

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

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

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

  使用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文件和控制文件的分离。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好!对于您的问题,可以采取以下步骤: 1. 创建一个自定义widget,包含标签和按钮,并且为按钮添加 clicked() 信号。 2. 在自定义widget的 clicked() 信号槽函数中,创建新的widget界面,并且为新的widget界面添加标签和按钮。 3. 在自定义widget的 clicked() 信号槽函数中,改变按钮的文本内容。 以下是示例代码: ```cpp // CustomWidget.h #ifndef CUSTOMWIDGET_H #define CUSTOMWIDGET_H #include <QWidget> class QLabel; class QPushButton; class CustomWidget : public QWidget { Q_OBJECT public: explicit CustomWidget(QWidget *parent = nullptr); signals: void clicked(); private: QLabel *m_label; QPushButton *m_button; }; #endif // CUSTOMWIDGET_H // CustomWidget.cpp #include "CustomWidget.h" #include <QHBoxLayout> CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent) { m_label = new QLabel("Custom Widget", this); m_button = new QPushButton("Change Text", this); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(m_label); layout->addWidget(m_button); connect(m_button, &QPushButton::clicked, [this]() { m_button->setText("Text Changed"); emit clicked(); }); } ``` 在主窗口中使用该自定义widget: ```cpp // MainWindow.cpp #include "MainWindow.h" #include "CustomWidget.h" #include <QHBoxLayout> #include <QVBoxLayout> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { CustomWidget *customWidget = new CustomWidget(this); connect(customWidget, &CustomWidget::clicked, [this]() { QWidget *widget = new QWidget(this); QLabel *label = new QLabel("New Widget", widget); QPushButton *button = new QPushButton("New Button", widget); QVBoxLayout *layout = new QVBoxLayout(widget); layout->addWidget(label); layout->addWidget(button); widget->show(); }); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(customWidget); QWidget *centralWidget = new QWidget(this); centralWidget->setLayout(layout); setCentralWidget(centralWidget); } ``` 当点击自定义widget中的按钮时,按钮的文本内容会改变,并且会创建一个新的widget界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值