从新开始写博客,记录一下QT学习之中遇到的坑,都是个人理解,有错误的地方,希望大家多多指正。
之前看见有人提出了能不能在子线程进行GUI渲染,都知道GUI是在主线程完成渲染的,但是可以通过QPainter在子线程“画”一张图片,然后通过信号槽的方式转递给主线程,再在主线程中渲染。这样做的好处是,如果渲染步骤太过繁琐,可以避免造成主线程长时间阻塞。
下面是笔者写的一个demo。
ImageThread::~ImageThread()
{
this->quit();
if(m_timer)
m_timer->deleteLater();
this->wait();
}
void ImageThread::run()
{
m_timer = new QTimer;
m_timer->setInterval(200);
connect(m_timer,&QTimer::timeout,this,&ImageThread::timeoutSlot,Qt::DirectConnection);
m_timer->start();
this->exec();
}
void ImageThread::timeoutSlot()
{
static double value = 0.0;
QPixmap pix(500,500);
pix.fill(Qt::white);
QPainter painter(&pix);
painter.setBrush(QBrush(Qt::green));
painter.drawRect(value*80,0,50,50);
painter.translate(0,250);
painter.setPen(Qt::red);
QVector<QPointF> points;
for(double v = value,v2 = 0.0;v2<2.0;v+=0.01,v2+=0.01)
{
points.push_back(QPointF(v2*250,sin(v)*250));
}
// qDebug()<<points.count();
painter.drawPolyline(points.data(),points.count());
painter.end();
value+=0.1;
if(value>6.28)
value = 0.0;
emit updateImage(pix);
}
这个就是绘图线程,每隔一段时间就会渲染一张QPixmap,然后通过信号槽的方式发送到Widget,Widget接收到信号之后,在渲染接收到的QPixmap,就可以实现在子线程进行GUI的渲染了。最后面是显示的效果。
(注:有大佬建议不要在子线程中使用定时器,因为定时器本身也属于一个线程,这点我还不是很清楚,改天按照大佬的提示去看看相应的源码,有时间了再来分享!)