#QT技巧 - 如何让主界面不卡顿
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
目录
环境:
QT版本:5.6.2
编译器:VS2013
系统环境:Windows 7 64bit
##1.核心思想
前后端分离
前端只做界面展示,后端只做数据处理
通俗一点就是 各人自扫门前雪,莫管他人瓦上霜
##2.流程级解释
##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