1、分析Qt工程中的基本程序代码
工程文件Mywnd.pro
#工程文件
QT += core gui #所需的类库
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #超过4版本的,需要加widgets
CONFIG += c++17 #支持c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
#工程中的源文件
SOURCES += \
main.cpp \
mywnd.cpp
#工程中的头文件
HEADERS += \
mywnd.h
#工程中的ui文件
FORMS += \
mywnd.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
头文件Mywnd.h
#ifndef MYWND_H
#define MYWND_H
#include <QWidget>
#include <QPushButton> //引入头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Mywnd; } //命名空间的声明
QT_END_NAMESPACE
class Mywnd : public QWidget //自定义的图形化界面类,公有继承自QWidget类
{
Q_OBJECT //信号与槽函数的元,涉及信号与槽函数的操作
signals:
void change(); //自定义的信号函数,是一个不完整的函数,只有声明没有定义
public slots:
//void on_change_slot(); //自定义的槽函数,是一个完整的函数,有声明也有定义
public:
Mywnd(QWidget *parent = nullptr); //自定义类的构造函数的声明,参数是QWidget类的指针,所依附的父组件
~Mywnd(); //自定义类的析构函数的声明
private:
Ui::Mywnd *ui; //ui界面的指针,可以通过该指针使用ui界面拖拽出的组件
QPushButton *btn; //自定义组件
};
#endif // MYWND_H
源文件Mywnd.cpp
#include "mywnd.h" //引入工程中的头文件
#include "ui_mywnd.h" //由ui界面生成的c++头文件
Mywnd::Mywnd(QWidget *parent) //自定义类的构造函数的定义
: QWidget(parent) //调用父类的有参构造函数,完成子类中从父类中继承下来的成员的初始化
, ui(new Ui::Mywnd) //给ui指针实例化空间
{
ui->setupUi(this); //调用ui指针指向的类的成员函数
this->btn=new QPushButton(this); //给自定义组件实例化对象
ui->pushButton->setText("ui->btn"); //通过ui指针使用ui界面中的组件
this->btn->setText("this->btn"); //通过this指针使用自定义的组件
}
Mywnd::~Mywnd() //自定义类的析构函数的定义
{
delete ui; //将ui指针所指向的空间手动释放
}
源文件main.cpp
#include "mywnd.h" //引入工程中的头文件
#include <QApplication> //引入应用程序的头文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //实例化一个应用程序对象
Mywnd w; //实例化自定义的类
w.show(); //调用类中的方法
return a.exec(); //轮询等待
}
2、手动实现Qt中的对象树模型
#include <iostream>
#include <list>
using namespace std;
class Object
{
public:
Object(Object *parent=nullptr){
if(parent!=nullptr){
parent->child.push_back(this);
}
}
virtual ~Object(){
for (auto it = child.begin(); it != child.end();it++){
delete *it;
}
}
public:
list<Object *> child;
};
class A : public Object
{
public:
A(Object *parent=nullptr){
if(parent!=nullptr){
parent->child.push_back(this);
}
cout << "A的构造函数" << endl;
}
virtual ~A(){
cout << "A的析构函数" << endl;
}
};
class B : public Object
{
public:
B(Object *parent=nullptr){
if(parent!=nullptr){
parent->child.push_back(this);
}
cout << "B的构造函数" << endl;
}
virtual ~B(){
cout << "B的析构函数" << endl;
}
};
int main(int agrc,const char *argv[])
{
A widget;
B *btn = new B(&widget);
return 0;
}