Qt里面的头文件和类名是一致的,知道头文件就知道类名,反之亦然
Qt头文件是没有.h的,基本都是以大写的Q开头
后续的代码编写都在widget.h和widget.cpp
一. widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
/*QT系统自己使用的命名空间预定义宏。也就是说以更快捷的方式定义QT自己的命名空间。
关于命名空间可以参考C++的命名空间*/
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QLineEdit *le,*le1; //声明行编辑框对象
QPushButton *pb; //声明按钮框对象
};
#endif // WIDGET_H
1.1代码 解析
namespace Ui
{
class Widget;
}
这是声明了一个名称为 Ui 的命名空间(namespace),包含一个类 Widget。
但是这个类 Widget 并不是本文件里定义的类 Widget,而是 ui_widget.h 文件里定义的类,用于描述界面组件的。
这个声明相当于一个外部类型声明(具体要看完 ui_widget.h 文件内的解释之后才能搞明白)。
Widget 类的定义
widget.h 文件的主体部分是一个继承于 QWidget 的类 Widget 的定义,也就是本实例的窗体类。
class Widget : public QWidget //创建继承自QWidget的自定义图形化界面类
{
Q_OBJECT //信号与槽对应的元
public:
Widget(QWidget *parent = nullptr);//构造函数的声明,参数四QWidget*类型的指针
~Widget(); //析构函数。
private:
Ui::Widget *ui; //ui界面的指针,可以通过该指针使用ui界面上的组
件
};
在 Widget 类中使用了宏 Q_OBJECT,这是使用 Qt 的信号与槽(signal 和 slot)机制的类都必须加入的一个宏(信号与槽在后面详细介绍)。
在 public 部分定义了 Widget 类的构造函数和析构函数。
在 private 部分又定义了一个指针。
Ui::Widget *ui; //ui界面的指针,可以通过该指针使用ui界面上的组件
这个指针是用前面声明的 namespace Ui 里的 Widget 类定义的,所以指针 ui 是指向可视化设计的界面,后面会看到要访问界面上的组件,都需要通过这个指针 ui。
二.widget.cpp
#include "widget.h"
#include <QVBoxLayout> //布局管理器头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
pb = new QPushButton("OK",this);//建立新的按钮框le = new QLineEdit(this);
//建立新的行编辑框lele1 = new QLineEdit(this);
//建立行编辑框le1
//方法1:pb -> setGeometry(0,100,50,50);
//设置物理方位 写法:告诉坐标 向下是y轴 向右是x轴 并说出宽和高的值
//方法2: 布局管理器
QVBoxLayout *vbox = new QVBoxLayout; //建立一个布局管理器 QVBoxLayout 垂直布局管理器
vbox->addWidget(le1); //布局行编辑框le1
vbox->addWidget(le); //布局行编辑框
vbox->addWidget(pb); //布局按钮this ->setLayout(vbox);
//设置布局管理器 把主界面交给布局管理器//将行编辑框和按钮连接起来 实现按钮按下行编辑框清空
//c++升级 添加了信号与槽机制 connect绑定自己的激发信号和对方对象的槽 实现效果:按下按钮 激发对方槽函数的执行
// connect(pb, SIGNAL(clicked(bool)),le,SLOT(clear()));
//实现点一下刺激两个对象 将一个对象中的东西搬移到另一个对象中去 解决方法:去升级主程序 槽函数的设计
connect(pb,SIGNAL(clicked(bool)),this,SLOT(movestr())); //当按钮按下 我希望把按钮的信号SIGNAL 连接到 this 软件的槽SLOT 调用movestr函数
}Widget::~Widget()
{}
#include "widget.h"
#include "ui_widget.h"
#include <QVBoxLayout> //竖直布局
#include <QHBoxLayout> //水平布局
#include <QGridLayout> //网状布局
#include <QFormLayout> //表格布局
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
le = new QLineEdit(this);
le1 = new QLineEdit(this);
pb = new QPushButton("OK",this);
QFormLayout *fbox = new QFormLayout;
fbox->addRow("user1",le);
fbox->addRow("user2",le1);
fbox->addRow("zz",pb);
this->setLayout(fbox);
#if 0
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(le1);
vbox->addWidget(pb);
this->setLayout(vbox);
#endif
#if 0
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addWidget(le);
hbox->addWidget(le1);
hbox->addWidget(pb);
this->setLayout(hbox);
#endif
#if 0
QGridLayout *gbox = new QGridLayout;
gbox->addWidget(le,0,0);
gbox->addWidget(le1,1,1);
gbox->addWidget(pb,2,0);
this->setLayout(gbox);
#endif
}
Widget::~Widget()
{
delete ui;
}
2.1代码 解析
Widget::Widget(QWidget *parent)
: QWidget(parent)
派生类不能在成员初始化列表中直接初始化基类的成员
初始化基类成员
构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员,“越级初始化”。派生类的构造函数的一般格式为:
派生类名(形参表):基类名1(形参表1),基类名2(形参表2)···
{···}
书籍,C++ Primer4中的15.4.2派生类构造函数有提到相关知识。