1. 创建Hello Word
两种方式,实现helloworld:
1.通过图形化的方式,在界面上创建出一个控件,显示helloworld
2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world;
1.1 图形化的方式
运行结果如下:
1.2 纯代码的方式
label“标签:界面上一个用来显示内容的字符串控件。
widget源文件如下:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QLabel* label = new QLabel(this);
//创建对象的时候可以在堆上创建,也可以在栈上创建,但是Qt中一般推荐在堆上创建对象
//this,是指给当前的label对象,指定一个父对象this,this是指调用该构造函数的对象
//即 main函数中的widget w这个对象
//此处new的方式创建对象,主要是将这个对象的生命周期交给Qt的对象数来统一管理。
//如果在栈上创建该控件对象,可能会存在提前释放的问题。
label->setText("Hello World");
//设置控件中,要显示的文本
//QString会隐式显式
}
Widget::~Widget()
{
delete ui;
}
1.3 内存泄露问题
上述代码,在Qt中不会产生内存泄露,label对象会合适的时候被析构释放(虽然没有手动写delete,确实能释放)之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。Qt中搞了一个对象树,也是N义树,把界面上的各种元素组织起来了。
通过这个树形结构,就把界面上要现实的这些控件对象都组织起来。组织的目的就是能够在合适的时候(窗口关闭/销毁),把这些对象统一进行释放。
如何查看文件的编码格式:
.cpp文件,点击右键,一explore方式打开进入资源管理器,将其文件以记事本的方式打开,点击另存为,查看文本框的编码格式。如果现实utf-8,说明这个文件就是utf-8编码;如果显示的是ansi,说明这个文件就是GBK编码。
Qt Creater内置的终端不一定是使用utf8的方式现实字符串。
后续再Qt中,如果想通过打印日志的方式输出一些调试信息,都优先使用qDebug。虽然使用cout也行,但是cout对于编码的处理不太好,在windows上容易出现乱码(如果是Linux使用QtCreator,一般就没事,Linux默认的编码一般都是utf8)。
使用qDebug,还有一个好处就是打印的调试日志,是可以统一进行关闭的。qDebug可以通过编译开关,来实现一键式关闭。
1.4 使用编辑框完成hw
编辑框分为单行编辑框(QLineEdit)和多行编辑框(QTextEdit);
form文件中图形化操作
纯代码操作:
#include "widget.h"
#include "ui_widget.h"
#include <QLineEdit>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QLineEdit* edit = new QLineEdit(this);
edit->setText("hello shangjialu");
}
Widget::~Widget()
{
delete ui;
}
1.5 使用按钮创建hw
push button普通按钮
Qt中的信号槽机制:本质就是给按钮的点击操作,关联上一个处理函数。当用户点击的时候,就会执行这个处理函数。
图形化界面操作
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleClick()
{
//当按钮被点击之后,就把按钮中的文本进行切换
if (ui->pushButton->text() == QString("hello shangjialu"))
{
ui->pushButton->setText("hello faka");
}
else {
ui->pushButton->setText("hello shangjialu");
}
}
纯代码的方式
#include "widget.h"
#include "ui_widget.h"
#include "widget.h"
#include <ui_widget.h>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myButton = new QPushButton(this);
myButton->setText("hello shangjialu");
connect(myButton,&QPushButton::clicked,this,&Widget::handleClick);
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleClick()
{
if(myButton->text() == "hello shangjialu"){
myButton->setText("shang linlu");
}else{
myButton->setText("hello shangjialu");
}
}
小结:
对于纯代码版本,按钮对象是咱们自己new的。为了保证其他函数中能够访问到这个变量,就需要把按钮对象设定为Widget类的成员变量。
对于图形界面版本版本,此时按钮对象,不需要咱们自己new。new对象的操作已经是被Qt自动生成了。而且这个按钮对象,已经作为ui对象里的一个成员变量,也无需作为Widget的成员。
实际开发中,是通过代码的方式构造界面为主,还是通过图形化界面的方式构造界面为主。这两种,都很主要,难分主次。
如果当前程序界面,界面内容是比较固定的,此时就会以图形化的方式来构造界面;但是如果程序界面,经常要动态变化,此时就会以代码的方式来构造界面。
1.6 QtCreator中的快捷键
注释:ctrl+/
运行:ctrl+R
编译:ctrl+B
字体缩放:ctrl+鼠标滑轮
查找:ctrl+F
整行移动:ctrl+shift+个/
帮助文档:F1
自动对齐:ctrl+i
同名之间的.h和.cpp的切换:F4生成函数声明的对应定义:alt+enter