20200518
类名即为头文件名
—————————————————分割线—————————————————
手动编译qt源代码的过程:
1. 生成解决方案 命令行输入qmake -project
解决方案*.pro中添加模块
QT += core gui widgets(用空格的形式添加了gui和widgets这2个模块)
#QT += core gui widgets //用#注释,编译时会出现“没有那个文件或目录”的错误
2. 生成Makefile文件 命令行输入qmake
3. 生成最终可执行文件 命令行输入make
—————————————————分割线—————————————————
uic工具:把Form文件编译成头文件(-o表示输出)
命令行输入:/路径/uic mytest.ui -o ui_mytest.h
—————————————————分割线—————————————————
【手动实现信号与槽】
unix signal
产生者(键盘) 绑定(signal(id, xxx)) 接收者.c xxx函数处理
qt 信号与槽
产生者(按钮等) 绑定(connect()) 接收者 可以为当前对象,槽去处理
练习:加法运算
手动绑定信号和槽
首先:按钮自带信号clicked。需要产生槽事件(*.h文件)。
private slots:
//处理单击求值(槽:专门处理信号的特殊函数)
void doProcessClick(bool);
然后:绑定信号和槽
Calculater::Calculater(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Calculater)
{
ui->setupUi(this);
//绑定信号和槽
QObject::connect(ui->btn_Sum,SIGNAL(clicked(bool)),this,SLOT(doProcessClick(bool)));
}
void Calculater::doProcessClick(bool){
qDebug()<<"hello world"<
使用qDebug( ) 时需要添加头文件 :#include
加减乘除的实现
void Calculater::doProcessClick(bool){
// qDebug()<<"hello world"<l1->text(); //取数
QString v2 = ui->l3->text();
QString symbol = ui->l2->text(); //判断加减乘除+-*/
v1_1 = v1.toInt();
v2_1 = v2.toInt();
if(symbol == "+"){
value = v1_1 + v2_1;
}
else if(symbol == "-"){
value = v1_1 - v2_1;
}
else if(symbol == "*"){
value = v1_1 * v2_1;
}
else if(symbol == "/"){
if(v2_1!=0){
value = v1_1 / v2_1;
}
else
value=0;
}
ui->l4->setText(QString::number(value)); //number 把整型转换为字符串
}
对字符串的操作:
QString类:构造函数的返回值是构造函数本身。
qppend类:(追加)
【应用技巧1】QString::number(value)); //number 把整型转换为字符串
【快捷键】Qt代码对齐:Ctrl+I
—————————————————分割线—————————————————
20200518
代码练习:计算器入门demo
QString a; //*.h头文件中声明
QStringList b;
C语言面向过程的编程思路:用a=" "; b=" ";这种方式清零。
C++面向对象的编程思路:调用对象里面的函数实现功能的清除,如 a.clear(); b.clear();进行清空。
实现效果图如下:4个数字(1234),2个符号(+=)
#include "calculater.h"
#include "ui_calculater.h"
#include
Calculater::Calculater(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Calculater)
{
ui->setupUi(this);
a.clear(); //初始界面要清空
b.clear();
}
Calculater::~Calculater()
{
delete ui;
}
void Calculater::on_pushButton_1_clicked()
{
a+="1"; //不管它按了多少次,字符串叠加
ui->lineEdit->setText(a);//在界面显示
}
void Calculater::on_pushButton_2_clicked()
{
a+="2";
ui->lineEdit->setText(a);
}
void Calculater::on_pushButton_3_clicked()
{
a+="3";
ui->lineEdit->setText(a);
}
void Calculater::on_pushButton_4_clicked()
{
a+="4";
ui->lineEdit->setText(a);
}
void Calculater::on_Btn_add_clicked()
{
b.insert(0,a); //在b的0的位置插入a。获取数组中的某个值,用at。(insert表示在指定位置插入)
b.insert(1,"+");//在b的1的位置插入+号
a.clear(); //把a清空
ui->lineEdit->setText(a);//按了+号后,界面空白
}
void Calculater::on_Btn_equal_clicked()
{
//有2个元素
if(b.count()==2){
b.insert(2,a);//如果里面元素有2个,则可以放第3个元素
if(b.at(1) == "+")//第1个值
{
int v3 = QString(b.at(0)).toInt()+QString(b.at(2)).toInt(); //强制转换为整型 a+b=c
ui->lineEdit->setText(QString::number(v3)); //用number函数将int转换为string类型,并显示出来
}
}
else//元素超过2个,界面清空
{
a.clear();
b.clear();
ui->lineEdit->setText(a);//再按一下=号,界面就清空了。
}
}
—————————————————分割线—————————————————
qt字符串的操作:QString 按F1
1. QString类型的构造函数:把[*]转换成QString字符串。
2. append 字符串拼接
3. arg 字符串格式化拼接,类型printf
compare 字符串比较 clear 清空
4. chop 字符串倒位剔除。从倒数之后的数据进行截取
5. contains 包含某个字符串
6. count 字符串统计
7. replace 查找替换
8. split 分割字符串
9. toxxx 把字符串转换成xxx
10. QString::number 把xxx(int, double, 数值)转换成QString类型
11. insert 插入到指定位置
课后练习:实现计算器(数字,+-*/=,小数,清除,删除,正负)
—————————————————分割线—————————————————
20200521
目标:手写代码实现进度条
qt中操作按顺序来:先改控件名称,然后转到槽。如若先转槽,再改名,会出现连接不上的情况。
如果不用现成的转到槽的方式,我们可以自己定义方法,然后手动绑定。
以下全是手动写代码,练习并熟悉手写代码的过程,○( ^皿^)っHiahiahia…
(1)头文件中:初始化函数
(2)*.cpp中实现初始化,并connect绑定
void ProgressBar::Init(){
connect(ui->btn_Start,SIGNAL(clicked(bool)),this,SLOT(doProcessStart(bool)));
connect(ui->btn_End,SIGNAL(clicked(bool)),this,SLOT(doProcessEnd(bool)));
}
(3)同时*.h头文件中手动添加所需的槽
private slots:
void doProcessStart(bool);
void doProcessEnd(bool);
(4)绑定后,一定要记得“引用”所定义的方法。
(5)同理,既然已在头文件中声明了槽,接下来就需要对槽实现一下。
void ProgressBar::doProcessStart(bool){ }
void ProgressBar::doProcessEnd(bool){ }
(6)对于启动和暂停,需要Timer
头文件中声明 QTimer *myTimer; 并增加头文件 #include
如果不加头文件,里面的方法用不了!
(7)在初始化中绑定Timer
切记:对于指针类型,一定要分配内存空间,不分配则为野指针,后果很严重——使用程序时,程序会直接退出去。
connect(发送者的超时信号,当前对象,超时槽信号)
void ProgressBar::Init(){
connect(ui->btn_Start,SIGNAL(clicked(bool)),this,SLOT(doProcessStart(bool)));
connect(ui->btn_End,SIGNAL(clicked(bool)),this,SLOT(doProcessEnd(bool)));
myTimer = new QTimer(this);
connect(myTimer,SIGNAL(timeout()),this,SLOT(doProcessTimeOut()));//头文件增加槽声明
}
(8)实现3个槽
void ProgressBar::doProcessStart(bool){
//启动
myTimer->start(1000); //1秒启动1次
}
void ProgressBar::doProcessEnd(bool){
//暂停
myTimer->stop();
}
void ProgressBar::doProcessTimeOut(){
ui->progressBar->setValue(0); //给界面赋值,0是定值,但这里要变化的值num,见后面
}
(9)头文件中增加一个全局变量 int num;
注意:如果不初始化++,会有问题的。
实现效果如下:一秒一次。
如果要快一点,就对num判断一下:
void ProgressBar::doProcessTimeOut(){
num++;
if(num==101)
num=0;
ui->progressBar->setValue(num); //给界面赋值
}
【建议】可以在*.ui文件中更改进度条的初始化显示属性
maximum=100 表示用100次走完整个进度条
maximum=10 表示10次走完整个进度条