Qt可视化设计的 UI 文件实现信号槽操作的简单理解

1. 窗口的UI可视化设计结果转换为代码

(1) 在构建项目时,UI文件widget.ui会被Qt的UIC编译为对应的C++语言文件ui_widget.h,该文件是构建项目时的一个中间文件。

#ifndef UI_WIDGET_H 
#define UI_WIDGET_H 
#include <QtCore/QVariant> 
#include <QtWidgets/QApplication> 
#include <QtWidgets/QLabel> 
#include <QtWidgets/QPushButton> 
#include <QtWidgets/QWidget> 
QT_BEGIN_NAMESPACE 
class Ui_Widget 
{ 
public:
    QLabel *labDemo; 
    QPushButton *btnClose; 
    void setupUi(QWidget *Widget) 
    { 
        if (Widget->objectName().isEmpty()) 
            Widget->setObjectName(QString::fromUtf8("Widget")); 
        Widget->resize(271, 162); 
        QFont font; 
        font.setPointSize(10); 
        Widget->setFont(font); 
        labDemo = new QLabel(Widget); 
        labDemo->setObjectName(QString::fromUtf8("labDemo")); 
        labDemo->setGeometry(QRect(65, 40, 156, 35)); 
        QFont font1; 
        font1.setPointSize(20); 
        font1.setBold(true); 
        labDemo->setFont(font1); 
        btnClose = new QPushButton(Widget); 
        btnClose->setObjectName(QString::fromUtf8("btnClose")); 
        btnClose->setGeometry(QRect(160, 105, 81, 31));
 
        retranslateUi(Widget); 
        QObject::connect(btnClose, &QPushButton::clicked, Widget, qOverload<>(&QWidget::close)); 
        QMetaObject::connectSlotsByName(Widget); 
    } // setupUi 

    void retranslateUi(QWidget *Widget) 
    { 
        Widget->setWindowTitle(QCoreApplication::translate("Widget", "First Demo", nullptr)); 
        labDemo->setText(QCoreApplication::translate("Widget", "Hello Qt6", nullptr)); 
        btnClose->setText(QCoreApplication::translate("Widget", "Close", nullptr)); 
    } // retranslateUi 
}; 
namespace Ui {
    class Widget: public Ui_Widget {}; 
} // namespace Ui 
QT_END_NAMESPACE 
#endif // UI_WIDGET_H 

在中间文件中定义了Ui_Widget类,用于封装可视化设计的界面。可以看到Ui_Widget类没有父类,不是从QWidget继承而来,所以Ui_Widget不是一个窗口类。

同时Ui_Widget类中定义了一个函数setupUi()函数,其输入输出参数定义如下:

void setupUi(QWidget *Widget)

可以看到,该函数为QWidget类及其部件上的子类部件设置属性值,并为部件设置信号与槽的关联

2. 窗口事件是如何与处理程序关联起来

IDE默认生成的QWidget头文件,如下所示:

#include <QWidget> 
QT_BEGIN_NAMESPACE 
namespace Ui { class Widget; } //一个名字空间 Ui,包含一个类 Widget 
QT_END_NAMESPACE 
class Widget : public QWidget 
{
    Q_OBJECT 
public: 
    Widget(QWidget *parent = nullptr); //构造函数
    ~Widget(); //析构函数
private: 
    Ui::Widget *ui; //使用 Ui::Widget 类定义的一个对象指针
}; 

在Widget类定义的第一行语句插入了一个宏Q_OBJECT,这是使用Qt元对象系统的类时必须插入的一个宏。插入了这个宏之后,Widget类中就可以使用信号与槽、属性等功能

对应的QWidget的实现文件,如下所示:

#include "widget.h" 
#include "ui_widget.h" 
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) 
{
    ui->setupUi(this); 
} 
Widget::~Widget() 
{
    delete ui; 
}

可以看到中间文件ui_widget.h文件在实现文件.cpp中被引用,在构造函数中setupUi被调用,已知setupUi()函数里会创建窗口上所有的界面组件,并以Widget窗口作为所有组件的父容器。而在构造函数中QWidget窗口类作为参数被传入。此时,QWidget窗口类与UI文件产生关联,从而得知对应UI窗口及其内部小部件的属性值和信号与槽、属性等功能。

 

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值