QT 关于多线程的UI界面

QT 关于多线程的动画特效

先展示效果
点击不同的暂停按钮会将当前的线程进入等待,然后其他两个线程会加快自己当前现成的运行速度,点开始会重新执行当前的线程。(但是这个内容中有个问题,自己懒没有修复,就是当点击了某一个暂停按钮后,不能再继续点击)

下面展示一下代码

先看一下总文件的形式
在这里插入图片描述
我们先看mythread.h中这个头文件的内容

#include <QThread>
#include <QObject>
#include <QDebug>
#include <QQueue>

#ifndef MYTHREAD_H
#define MYTHREAD_H

class Mythread :public QThread
{
   Q_OBJECT
public:
   Mythread();
   void run();   //run函数,这个就是多线程的线程函数
   int i=3;
//   QQueue<int> q;

signals:
   void send_output_text(QString);   //这个用作给UI界面发消息显示用的
   void pauseSingnal();

private slots:
//   void thread_start();    //线程启动槽函数,接收到主线程的启动信号,就会触发
//   void thread_exit();     //线程结束槽函数,接收到主线程的结束信号,就会触发
//   void thread_start_1();
//   void thread_exit_1();
//   void thread_exit_2();
//   void thread_start_2();
   void thread_pause(); //按钮判断的值
   void thread_resume();

private:
   bool pause_flag;
};

#endif // MYTHREAD_H

在展示一下mythread.cpp的代码段

#include "mythread.h"

Mythread::Mythread():pause_flag(false)
{
    q.enqueue(3);
}

void Mythread::run()   //多线程执行函数
{
    int n=0;
    while(true)
    {
        while(pause_flag){
            msleep(10);
        }
        emit send_output_text(QString::number(n));
        n++;
//        msleep(10*q.last()*q.last());
        msleep(10*i*i*i);
        qDebug()<<q<<endl;
    }
}

void Mythread::thread_resume()
{
//    q.enqueue(i++);
    pause_flag = false;
}

void Mythread::thread_pause()
{
//    q.enqueue(i--);
    pause_flag = true;
}

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QRect>
#include <QPoint>
#include <QWidget>
#include <QPixmap>
#include "mythread.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    int i=3;
    Mythread t;

signals:
    void send_thread_start();    //发出启动信号
    void send_thread_exit();     //发出结束信号
    void send_thread_exit_1();
    void send_thread_start_1();
    void send_thread_exit_2();
    void send_thread_start_2();

private slots:
    void append_text(QString);      //文本框添加文本槽函数
    void append_text_1(QString);
    void append_text_2(QString);

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void moveImg();
    void moveImg_2();
    void moveImg_3();

private:
    Ui::Widget *ui;

    Mythread *myth ;     //实例化一个MYthread对象出来
    Mythread *myth_2;
    Mythread *myth_3;

    void add(int id);
    void sub(int id);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
//#include "mythread.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    myth = new Mythread();     //实例化一个MYthread对象出来
    myth_2=new Mythread();
    myth_3=new Mythread();

    connect(this, SIGNAL(send_thread_start()), myth, SLOT(thread_resume()));  //线程重启
    connect(this, SIGNAL(send_thread_exit()), myth, SLOT(thread_pause()));    //线程暂停
    connect(myth, SIGNAL(send_output_text(QString)), this, SLOT(append_text(QString))); //文本显示
    connect(this, SIGNAL(send_thread_start_1()), myth_2, SLOT(thread_resume()));  //线程启动
    connect(this, SIGNAL(send_thread_exit_1()), myth_2, SLOT(thread_pause()));    //线程终止
    connect(myth_2, SIGNAL(send_output_text(QString)), this, SLOT(append_text_1(QString))); //文本显示
    connect(this, SIGNAL(send_thread_start_2()), myth_3, SLOT(thread_resume()));  //线程启动
    connect(this, SIGNAL(send_thread_exit_2()), myth_3, SLOT(thread_pause()));    //线程终止
    connect(myth_3, SIGNAL(send_output_text(QString)), this, SLOT(append_text_2(QString))); //文本显示

    myth->start();
    myth_2->start();
    myth_3->start();
//    ui->label->setPixmap(QPixmap("b.png").scaled(ui->label->size(), Qt::IgnoreAspectRatio));
//    ui->label_2->setPixmap(QPixmap("D:\qt\code\Thread\a.jpg").scaled(ui->label_2->size(),Qt::IgnoreAspectRatio));
//    ui->label_3->setPixmap(QPixmap("D:\qt\code\Thread\a.jpg").scaled(ui->label_3->size(),Qt::IgnoreAspectRatio));

}

Widget::~Widget()
{
    delete ui;
}

void Widget::append_text(QString str)   //编辑框追加文本槽函数
{
    ui->textEdit->setText(str);
    moveImg();
}

void Widget::append_text_1(QString str)
{
    ui->textEdit_2->setText(str);
    moveImg_2();
}

void Widget::append_text_2(QString str){
    ui->textEdit_3->setText(str);
    moveImg_3();
}

void Widget::add(int id)
{
    switch (id) {
    case 1:
        myth_2->i++;
        myth_3->i++;
        break;
    case 2:
        myth->i++;
        myth_3->i++;
        break;
    case 3:
        myth_2->i++;
        myth->i++;
        break;
    default:
        break;
    }
}

void Widget::sub(int id)
{
    switch (id) {
    case 1:
        myth_2->i--;
        myth_3->i--;
        break;
    case 2:
        myth->i--;
        myth_3->i--;
        break;
    case 3:
        myth_2->i--;
        myth->i--;
        break;
    default:
        break;
    }
}

void Widget::on_pushButton_clicked()
{
    add(1);
    emit send_thread_start();
}

void Widget::on_pushButton_2_clicked()
{
    sub(1);
    emit send_thread_exit();
}

void Widget::on_pushButton_3_clicked()
{
    add(2);
    emit send_thread_start_1();
}

void Widget::on_pushButton_4_clicked()
{
//    i_2=true;
    sub(2);
    emit send_thread_exit_1();
}

void Widget::on_pushButton_5_clicked()
{
    add(3);
    emit send_thread_start_2();
}

void Widget::on_pushButton_6_clicked()
{
//    i_3=true;
    sub(3);
    emit send_thread_exit_2();
}

void Widget::moveImg()
{
    QLabel *label = ui->label;
    if(label->geometry().y()>=((QWidget*)label->parent())->height())
        label->setGeometry(QRect(QPoint(label->geometry().x(),0),label->size()));
    label->setGeometry(QRect(QPoint(label->geometry().x(),label->geometry().y()+5),label->size()));
}

void Widget::moveImg_2()
{
    QLabel *label = ui->label_2;
    if(label->geometry().y()>=((QWidget*)label->parent())->height())
        label->setGeometry(QRect(QPoint(label->geometry().x(),0),label->size()));
    label->setGeometry(QRect(QPoint(label->geometry().x(),label->geometry().y()+5),label->size()));
}

void Widget::moveImg_3()
{
    QLabel *label = ui->label_3;
    if(label->geometry().y()>=((QWidget*)label->parent())->height())
        label->setGeometry(QRect(QPoint(label->geometry().x(),0),label->size()));
    label->setGeometry(QRect(QPoint(label->geometry().x(),label->geometry().y()+5),label->size()));
}

moveImg这几个函数就是定义图片的运行轨迹,如有不懂得函数自己去查。
不懂得可以联系我。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值