目录
- 1、界面设计
- Qt5元对象系统
- 1. **QObject 类**
- 2. **QMetaObject**
- 3. **信号和槽机制**
- 4. **宏:Q_OBJECT**
- 5. **动态属性**
- 6. **反射机制**
- 7. **元对象编译器(MOC)**
- 2、完成程序功能
1、界面设计
不点创建界面
在dialog.h中
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
private:
QLabel *label1,*label2;
QLineEdit *lineEdit;
QPushButton *button;
};
#endif // DIALOG_H
Q_OBJECT宏的作用是启动Qt5元对象系统的一些特性(如支持信号和槽机制等),它必须放置到类定义的私有区中。
Qt5 的元对象系统(Meta-Object System)是 Qt 框架的核心机制之一,尤其是在支持 Qt 的信号和槽机制、动态属性、以及反射等方面起着关键作用。它为 Qt 提供了C++ 标准语言中没有的一些动态特性。主要的元对象系统相关的类和宏包括:
Qt5元对象系统
1. QObject 类
- QObject 是 Qt 中所有对象类的基类,提供了元对象系统的功能,如信号和槽、事件处理等。
- 在 QObject 基类中定义的对象支持动态属性操作,可以使用
setProperty()
和property()
方法来修改和访问对象的属性。
2. QMetaObject
- 每个 QObject 类的实例都会有一个与之关联的元对象,这个元对象是类的静态信息的封装。
QMetaObject
提供了对类的元数据(例如类名、继承关系、信号、槽和属性)的访问。 - 可以使用
QObject::metaObject()
方法来访问对象的元对象。
3. 信号和槽机制
- Qt 的信号和槽机制允许对象之间的通信,特别是在 UI 编程中被大量使用。
- 信号通过
signals:
关键字定义,而槽是一个普通的 C++ 函数,通过slots:
关键字声明。 - 当一个信号被触发时,所有连接到该信号的槽函数都会被调用。
- 信号和槽机制在编译时通过元对象编译器(MOC)生成相应的代码。
4. 宏:Q_OBJECT
- 类中使用
Q_OBJECT
宏来启用元对象系统功能。这个宏需要放在类的定义部分,并且需要运行元对象编译器(MOC)来生成信号和槽等相关代码。 - 如果一个类不使用
Q_OBJECT
,它将不能使用信号和槽机制、动态属性、以及 Qt 的反射系统。
5. 动态属性
- 使用元对象系统,Qt 支持动态添加和修改属性。可以通过
setProperty()
方法动态设置属性,通过property()
方法获取属性值。
6. 反射机制
- 通过元对象系统,Qt 实现了有限的反射功能。你可以通过
QMetaObject
获取类的类型信息、函数列表、信号和槽的信息。 - 可以使用
QMetaObject::invokeMethod()
动态调用对象的槽函数,类似于其他语言中的反射机制。
7. 元对象编译器(MOC)
- MOC 是 Qt 提供的一个预处理工具,用于处理那些包含
Q_OBJECT
宏的类,并为这些类生成元对象代码,包括信号和槽的处理函数。这是 Qt 的元对象系统能够在 C++ 上工作的重要部分。
Qt 的元对象系统不仅是 Qt 提供强大功能的基础,也是让 Qt 在 C++ 上实现类似于动态语言特性的关键部分。
在dialog.cpp中
#include "dialog.h"
#include <QGridLayout>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
label1=new QLabel(this);
label1->setText(tr("请输入圆的半径: "));
lineEdit=new QLineEdit(this);
label2=new QLabel(this);
button=new QPushButton(this);
button->setText(tr("显示对应圆的面积"));
QGridLayout *mainLayout=new QGridLayout(this);
mainLayout->addWidget(label1,0,0);
mainLayout->addWidget(lingEdit,0,1);
mainLayout->addWidget(label2,1,0);
mainLayout->addWidget(button,1,1);
}
Dialog::~Dialog()
{
}
2、完成程序功能
在dialog.h中添加代码
在dialog.cpp中添加