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

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

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

目录

文章目录

    • #QT技巧 - 如何让主界面不卡顿
    • @[toc]

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

##1.核心思想

前后端分离

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

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

##2.流程级解释

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

##3.代码级解释

目前QT有3种方式,进行异步操作。
###1.继承QThread
###2.继承QRunable
###3.使用QtConcurrent

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

pro中加入

QT       += concurrent

mybusiness.cpp

#include "mybusiness.h"
#include 
#include 

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 
#include 


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

你可能感兴趣的:(QT)