QTcreator内的环境观察

引言代码解释

main.cpp
cpp
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);//对象
myWidget w;//子类对象w其父类对象是myQwidget
w.show();//展示类似print
return a.exec();//.exec表示将程序执行起来
}
mywidget.h
cpp
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class myWidget; }
QT_END_NAMESPACE
class myWidget : public QWidget//QT内每个类都有"同名"头文件
{
Q_OBJECT//qt内置的 "宏" 与"信号"与"槽"相关
public:
myWidget(QWidget *parent = nullptr); //parent QT内对象创建时"对象树"上的父节点(QT对象 N叉树)
~myWidget();
private:
Ui::myWidget *ui;//与form file相关
};
#endif // MYWIDGET_H
mywidget.cpp
cpp
#include "mywidget.h"
#include "ui_mywidget.h"//form file被qmake生成的头文件
//构造函数在.cpp下定义
myWidget::myWidget(QWidget *parent)
: QWidget(parent)//派生类的构造函数必须调用基类的构造函数来初始化基类的那一部分成员
//如果基类没有默认构造函数那么派生类必须在初始化列表阶段显示调用基类的构造函数
, ui(new Ui::myWidget)
{
ui->setupUi(this);//把form file和qmake生成的文件关联起来
}
myWidget::~myWidget()
{
delete ui;
}
qmake:
qmake是一个构建工具(build tool),读取.pro文件生成makefile---告诉编译器怎么编译、链接
.pro 是QT项目的工程文件 是构建qmake工具的重要依据
内部将:语言模块(如C++11) 文件架构模块(如图:)



第一个hello world创建
代码实现:
#include<QLable>
QLable* lable = new QLable(this); // 创建对象并使用this初始化
lable->setText("hello"); //文本设置
cpp
#include<QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// QLabel* lable = new QLable("hello");
QLabel* lable = new QLabel(this);//对象实例化化
lable->setText("hello");//文本设置
}
Widget::~Widget()
{
delete ui;
}

内存泄漏问题:
GUI式创建:

对象树1.0
对象树自动处理了内存无需手动delete等操作
对象树的结构:

qt中cout的乱码

打印乱码的原因:
编码与解码方式不匹配。
<QDebug>
格式:qDebug() << "output content";
益处:使用qDebug()对于日志的打印调试是友好的,其可以在发布阶段(分布功能)直接关闭。
二建hello world!
前言:应用编辑框的方式实现。编辑框实现的在程序运行后依然可以编辑文本。
控件方式
左侧ui文件Widget.ui内左侧栏Iuput Wigets的line Edit控件拖动编辑文字



代码方式
于Wigdet.cpp源文件内的构造函数内,构造QLineEdit对象edit建立与对象树的链接:
cpp
QLineEdit* edit = new QLineEdit(this);
利用创建的对象设置文本hello world!
cpp
edit->setText("hello world!");

三建hello world!
目标:实现hello world!与world hello!!间的循环切换
控件+代码
connect();函数初识
connect是QObject这个类提供的静态函数。这个函数的作用就是 链接信号和槽。
connect() ; // 涉及信号、槽的机制
本质是位处理按钮的点击操作信号关联到一个处理函数,当点击后就执行这个函数。
先进行控件的构建
找到ui文件Wigdet.ui左侧Buttons栏下"Push Button"拖动并编辑"hello world!"。
右侧栏下可以编辑该控件的名称(其作为Widget这个类的成员)。
"hello world!"是内容,pushButton是(默认)控件名称。

这里将名字修改为PushButton
其次是代码的辅助
在widget.cpp的构造函数内:
cpp
// 点击信号传入 调用处理函数
connect(ui->PushButton, &QPushButton::clicked, this, &Widget::handleClick);
// PushButton是成员变量 关联Widget槽函数
void Widget::handleClick();定义

关于"成员变量"的解释:
打开qmake自动构建的ui_Wigdet.h文件我们发现在ui_Wigdet类内自动生成了对应的成员变量"PushButton"。

纯代码手搓
setText();设置文本
text();返回文本内容
前言:极大体现了框架能力,于不同.cpp与.h和main.c文件的配合。
Ⅰwidget.cpp内构建QPushButton对象button,由上文得知需要连接this。
cpp
QPushButton* button = new QPushButton(this);//链接
Ⅱbutton对象的文本设置与connect处理点击操作
cpp
button->setText("hello world!");
connect(button, &QPushButton::clicked, this, &Widget::handleClick);
ⅢhandleClick定义
我们发现假若button定义在构造函数内那我们无法在handleClick函数内调用。
思路一:采用函数传参的方式传递参数button,但是我们发现若传递参数会出现在connect函数内无法为其提供正确格式的参数的结果(会转为函数调用目的是传递函数指针)。 因此思路一舍弃
思路二:将button转为成员变量。函数定义在类内,均可访问类内成员,思路合理。
cpp
//Widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
, _button(new QPushButton(this))//变成员变量相关
{
ui->setupUi(this);
//因为成员变量的引入 无需创建 QPushButton* button = new QPushButton(this);//链接
_button->setText("hello world!");
connect(_button, &QPushButton::clicked, this, &Widget::handleClick);
//为解决button的传递问题变成成员变量
}
运行:



使用函数指针时为什么要加"&"?
答:connect槽函数是一个模板,对类型有特殊要求。