对象树模型
#include <iostream>
#include <list>
using namespace std;
/*NULL 和 nullptr区别
* C++11后 才有nullptr
* C++中NULL实际上就是0,其宏定义为 #define NULL 0
* C中NULL 宏定义为 #define (void *)0
* C++中类型不能自动进行强制转换
* 最好在C++中利用nullptr初始化指针
*/
class object{
public:
list<object*> children; // 定义链表来存储指向对象的指针
object(object *p=nullptr){
if(p!=nullptr){ //若不添加p!=nullptr,在对象a构造时会出错,空指针指向链表报错
p->children.push_back(this);
}
cout<<"object::构造函数"<<endl;
}
virtual ~object(){
cout<<"object::析构函数"<<endl;
for(auto p=children.begin();p!=children.end();p++){ //释放内存
delete *p;
}
}
private:
};
class A:public object{
public:
A(object *p=nullptr){
if(p!=nullptr){
p->children.push_back(this);
}
cout<<"A::构造函数"<<endl;
}
~A(){
cout<<"A::析构函数"<<endl;
}
private:
};
class B:public object{
public:
B(object *p=nullptr){
if(p!=nullptr){
p->children.push_back(this);
}
cout<<"B::构造函数"<<endl;
}
~B(){
cout<<"B::析构函数"<<endl;
}
private:
};
int main()
{
A a;
B *b=new B(&a);
/* ---->object *p=&a 实际上父类指针指向子类对象
* 父类指针p指向对象a的地址
* 在b的构造函数中,p指向a,通过p来往children list中添加指向对象的指针,(将指向b的指针添加到链表中)
* 当对象a进行析构时,会调用object析构函数,通过object的析构函数,释放链表中的数据
*/
return 0;
}
界面设置
.h
#ifndef MY_WIDGET_H
#define MY_WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include <QLineEdit>
#include <QTextToSpeech>
QT_BEGIN_NAMESPACE
namespace Ui { class my_Widget; }
QT_END_NAMESPACE
class my_Widget : public QWidget
{
Q_OBJECT
public:
my_Widget(QWidget *parent = nullptr);
~my_Widget();
private:
Ui::my_Widget *ui;
QPushButton *btn; //按钮
QLineEdit *edit; //行编辑器
QTextToSpeech *speak;
};
#endif // MY_WIDGET_H
.cpp
#include "my_widget.h"
#include "ui_my_widget.h"
#include <QVBoxLayout>
my_Widget::my_Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::my_Widget)
,btn(new QPushButton(this))
,edit(new QLineEdit(this))
{
ui->setupUi(this); //指向ui 控制拖拽的组件
this->setWindowTitle("first title"); //设置窗口标题
this->setWindowIcon(QIcon("C:\\Users\\15721\\Desktop\\LEARN\\bell.png")); //设置窗口图标
edit->resize(300,30); //修改组件尺寸
this->btn->move(edit->width(),0); //移动组件
QString s=this->windowTitle(); //获取窗口标题
qDebug()<<"window name: "<<s; //打印
//qDebug("窗体信息: %s","111");
this->setMaximumSize(1024,768); //设置最大尺寸
this->setMinimumSize(300,200); //设置最小尺寸
// this->setFixedSize(1024,768); //固定尺寸
this->setWindowOpacity(1); //设置透明度
this->setStyleSheet(QString::fromUtf8("background-color: rgb(255, 109, 12);")); //更改样式表
}
my_Widget::~my_Widget()
{
delete ui;
delete btn;
}