Qt开发自学4_手码计算器和进度条

本文详细介绍了Qt编程的基础知识,包括如何手动编译Qt源代码、使用uic工具将UI文件转换为头文件,以及如何实现信号与槽机制。通过具体实例,如计算器和进度条的实现,深入讲解了Qt字符串操作、事件处理和定时器的应用。

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"<<endl;
}

使用qDebug( ) 时需要添加头文件 :#include <QDebug>

每次代码改动之后,先【构建】-->【清理所有项目】,然后【重新构建所有项目】。

加减乘除的实现

void Calculater::doProcessClick(bool){
//    qDebug()<<"hello world"<<endl;    //调试信息
    int value=0;  //和值初始化
    int v1_1, v2_1;     //用于字符串到整型的转换
    QString v1 = ui->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 <QDebug>

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 <QTimer>

如果不加头文件,里面的方法用不了!

(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次走完整个进度条

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢奕冰2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值