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

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

Qt开发自学4_手码计算器和进度条_第1张图片

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

加减乘除的实现

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

Qt开发自学4_手码计算器和进度条_第2张图片

 

—————————————————分割线—————————————————

20200518

代码练习:计算器入门demo

QString a;   //*.h头文件中声明   
QStringList b;

C语言面向过程的编程思路:用a=" "; b=" ";这种方式清零。

C++面向对象的编程思路:调用对象里面的函数实现功能的清除,如 a.clear(); b.clear();进行清空。

实现效果图如下:4个数字(1234),2个符号(+=)

Qt开发自学4_手码计算器和进度条_第3张图片

#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  插入到指定位置

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

 

课后练习:实现计算器(数字,+-*/=,小数,清除,删除,正负)

Qt开发自学4_手码计算器和进度条_第5张图片

—————————————————分割线—————————————————

20200521

目标:手写代码实现进度条

Qt开发自学4_手码计算器和进度条_第6张图片

qt中操作按顺序来:先改控件名称,然后转到槽。如若先转槽,再改名,会出现连接不上的情况。

如果不用现成的转到槽的方式,我们可以自己定义方法,然后手动绑定。

        以下全是手动写代码,练习并熟悉手写代码的过程,○( ^皿^)っHiahiahia…

(1)头文件中:初始化函数

Qt开发自学4_手码计算器和进度条_第7张图片

(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)绑定后,一定要记得“引用”所定义的方法。

Qt开发自学4_手码计算器和进度条_第8张图片

(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;

       注意:如果不初始化++,会有问题的。

Qt开发自学4_手码计算器和进度条_第9张图片

实现效果如下:一秒一次。

Qt开发自学4_手码计算器和进度条_第10张图片

 

如果要快一点,就对num判断一下:

void ProgressBar::doProcessTimeOut(){
    num++;
    if(num==101)
        num=0;
    ui->progressBar->setValue(num);  //给界面赋值
}

【建议】可以在*.ui文件中更改进度条的初始化显示属性

Qt开发自学4_手码计算器和进度条_第11张图片

maximum=100 表示用100次走完整个进度条

maximum=10 表示10次走完整个进度条

你可能感兴趣的:(Qt)