QT技巧 - 如何让主界面不卡顿

QT技巧 - 如何让主界面不卡顿


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

目录


环境:
QT版本:5.6.2
编译器:VS2013
系统环境:Windows 7 64bit


1.核心思想

前后端分离

前端只做界面展示,后端只做数据处理

通俗一点就是 各人自扫门前雪,莫管他人瓦上霜

2.流程级解释

Created with Raphaël 2.1.2 开始 用户界面操作 emit信号 后台槽函数接收 执行操作 后台emit信号 前台槽函数接受 前台更新展示数据 结束

3.代码级解释

目前QT有3种方式,进行异步操作。

1.继承QThread

2.继承QRunable

3.使用QtConcurrent

以QtConcurrent为例,要获取目录下文件列表并展示到界面上。

pro中加入

QT       += concurrent

mybusiness.cpp

#include "mybusiness.h"
#include <QDebug>
#include <QThread>

MyBusiness::MyBusiness(QObject *parent) : QObject(parent)
{

}

QStringList MyBusiness::getFileList(QString address)
{
    qDebug() << "MyBusiness getFileList Thread" << QThread::currentThreadId();

    QStringList result;

    //查询数据库获取数据
    for(int i = 0; i < 10;i++)
    {
       result.insert(i,QString::number(i)+ ".txt");

       QThread::sleep(1);
    }

    //发送获取的数据
    emit fileListResult(result);

    return result;
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStringListModel>
#include <QDebug>


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

    //前台接收数据并展示
    connect(&m_myBusiness,&MyBusiness::fileListResult,this,&MainWindow::updateFileListUI);
}

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

void MainWindow::updateFileListUI(QStringList result)
{
    QStringListModel * model = new QStringListModel(this);

    model->setStringList(result);

    ui->listView->setModel(model);
}

void MainWindow::on_pushButton_clicked()
{
    qDebug() << "MainWindow on_pushButton_clicked Thread" <<QThread::currentThreadId();

    //异步调用其他类的函数
    QtConcurrent::run(&m_myBusiness,&MyBusiness::getFileList,QString("E:\\"));
}

void MainWindow::on_pushButtonSync_clicked()
{
    qDebug() << "MainWindow on_pushButtonSync_clicked Thread" <<QThread::currentThreadId();

    QStringList result;

    //查询数据库获取数据
    for(int i = 0; i < 10;i++)
    {
       result.insert(i,QString::number(i)+ ".txt");

       QThread::sleep(1);
    }

    QStringListModel * model = new QStringListModel(this);

    model->setStringList(result);

    ui->listView->setModel(model);
}

线程信息输出:

MainWindow on_pushButton_clicked Thread 0x2370
MyBusiness getFileList Thread 0xab0
MainWindow on_pushButtonSync_clicked Thread 0x2370

结果:
异步操作:流畅运行,连续点击界面不卡顿
同步操作:连续点击界面卡顿
这里写图片描述

Demo地址:
https://download.csdn.net/download/itas109/10297478

旧的Demo:
https://download.csdn.net/download/itas109/10297256


Reference:
https://www.zhihu.com/question/22992772/answer/301884758

觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
微信
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

猜你喜欢

转载自blog.csdn.net/itas109/article/details/79621255