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

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

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

目录

环境:
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 <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

Qt,在线程创建UI控件时,如果耗时较长,导致界面卡顿,影响用户体验。为了解决这个问题,可以在子线程创建UI控件,然后将UI控件通过信号槽机制传递给线程,从而实现界面不卡顿。 具体步骤如下: 1. 在子线程创建UI控件。 2. 将UI控件通过信号槽机制发送给线程。 3. 在线程接收信号,将UI控件添加到窗口。 以下是示例代码: ``` c++ // 在子线程创建按钮 QPushButton* button = new QPushButton("Button"); // 发送信号,将按钮传递给线程 emit createButton(button); ``` 在上述示例代码,我们在子线程创建了一个QPushButton对象,然后通过信号槽机制将按钮传递给线程。具体来说,我们定义了一个createButton信号,它有一个QPushButton指针参数,表示需要在线程创建的按钮。在子线程,当我们创建了按钮后,就通过emit发射createButton信号,从而将按钮传递给线程。 在线程,我们需要连接createButton信号和槽函数,将传递过来的按钮添加到窗口。具体来说,我们可以在窗口的构造函数连接createButton信号和槽函数,如下所示: ``` c++ // 在窗口的构造函数连接信号和槽函数 connect(this, &MainWindow::createButton, this, &MainWindow::addButton); ``` 在上述代码,我们将createButton信号和槽函数addButton连接起来,表示当子线程创建了按钮并发射createButton信号时,触发addButton槽函数的执行。 最后,我们需要实现addButton槽函数,将传递过来的按钮添加到窗口,如下所示: ``` c++ // 将传递过来的按钮添加到窗口 void MainWindow::addButton(QPushButton* button) { QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(button); setLayout(layout); } ``` 在上述代码,我们将传递过来的按钮添加到窗口的布局,从而实现了在子线程创建UI控件,并在线程添加UI控件的功能,避免了界面卡顿的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itas109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值