#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->pBStart->setEnabled(true);
ui->pBPause->setEnabled(false);
ui->pBEnd->setEnabled(false);
ui->label->setScaledContents(true);
ui->label_2->setScaledContents(true);
for(int i=0;i<threadNum;i++)
{
thread[i].setThreadID(i);
connect(&thread[i],SIGNAL(pictureNumber(int,int)),this,SLOT(getPicture(int ,int)));
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::getPicture(int num,int threadID)
{
QPixmap temp;
QString path="pictures/";
path+=QString::number(num+1);
path=path+".png";
temp.load(path);
if(threadID==0)
ui->label->setPixmap(temp);
if(threadID==1)
ui->label_2->setPixmap(temp);
}
void Widget::on_pBStart_clicked()
{
qDebug()<<"the begin";
for(int i=0;i<threadNum;i++)
{
thread[i].start();
thread[i].threadBegin();
}
ui->pBStart->setEnabled(false);
ui->pBPause->setEnabled(true);
ui->pBEnd->setEnabled(true);
}
void Widget::on_pBPause_clicked()
{
for(int i=0;i<threadNum;i++)
{
thread[i].threadPause();
}
QString text;
if(ui->pBPause->text()==QString::fromLocal8Bit("暂停"))
text=QString::fromLocal8Bit("继续");
else if(ui->pBPause->text()==QString::fromLocal8Bit("继续"))
text=QString::fromLocal8Bit("暂停");
ui->pBPause->setText(text);
}
void Widget::on_pBEnd_clicked()
{
for(int i=0;i<threadNum;i++)
{
thread[i].threadStop();
}
ui->pBStart->setEnabled(true);
ui->pBEnd->setEnabled(false);
ui->pBPause->setEnabled(false);
}
void Widget::closeEvent(QCloseEvent *event)
{
for(int i=0;i<threadNum;i++)
{
thread[i].threadStop();
if(thread[i].isRunning())
{
thread[i].threadStop();
thread[i].wait();
}
}
event->accept();
}
qt多线程显示图片.rar
需积分: 0 201 浏览量
更新于2023-03-07
2
收藏 17.68MB RAR 举报
在Qt框架中,多线程技术是用于提升应用程序性能和响应速度的重要手段,尤其是在处理耗时操作如图像处理、网络通信等场景。本项目“qt多线程显示图片.rar”显然是一个利用Qt的多线程功能来实现图片显示的例子。在实际应用中,由于GUI(图形用户界面)线程需要保持流畅,避免因图像加载等计算密集型任务阻塞导致界面卡顿,多线程技术可以将这些任务放在后台执行。
Qt中多线程的核心类是`QThread`,它提供了一种在C++中管理线程的机制。在描述中提到的项目中,开发者创建了两个线程,一个用于主线程,负责用户交互和界面更新,另一个则用于处理图片加载和显示。这种设计确保了即使在处理大量图片或大尺寸图片时,用户界面仍然能够保持响应。
理解`QThread`的工作原理至关重要。`QThread`对象代表了一个操作系统级别的线程,通过继承`QThread`并重写`run()`方法,可以自定义线程的行为。通常,我们并不直接在`run()`中执行UI相关的操作,因为这可能导致跨线程访问的错误。相反,我们应当使用信号和槽机制,这是Qt事件驱动模型的一部分,允许在不同线程间安全地传递信息。
在这个项目中,可能有一个专门用于读取和解码图片的线程,它在`run()`方法中执行这些操作。当图片准备好显示时,它会发出一个信号,例如`imageReady()`,并将图片数据作为参数传递。主线程中的槽函数会连接到这个信号,接收到信号后,在GUI线程中安全地更新图像控件,如`QLabel`的`setPixmap()`方法。
为了保证线程间的通信安全,Qt提供了`QMutex`和`QSemaphore`等同步原语。在多线程访问同一资源(如图片数据)时,这些工具可以防止竞态条件和数据不一致。此外,`QWaitCondition`可能被用来让一个线程等待特定条件满足后再继续执行,例如等待图片加载完成。
项目描述中还提到需要将文件名改为英文再编译执行,这是因为Qt库在处理非ASCII字符时可能存在一些问题,尤其是在多线程环境中。这可能是为了避免潜在的编码问题,确保程序的稳定性和兼容性。
总结来说,"qt多线程显示图片.rar"项目展示了如何使用Qt的多线程特性来分离图片处理和GUI更新,从而提高用户体验。主要涉及的知识点包括`QThread`的使用、信号与槽的通信机制、线程同步以及跨线程数据访问的安全性。对于深入学习Qt和多线程编程的开发者来说,这是一个很好的实践案例。
zmq1998
- 粉丝: 23
- 资源: 2