Qt线程创建窗体如题:如何在一个Qt线程中,实现一个Widget的创建[解决办法]据我了解 GUI 的东西 只能在GUI
Qt线程创建窗体
如题:
如何在一个Qt线程中,实现一个Widget的创建
[解决办法]
据我了解 GUI 的东西 只能在GUI 线程 就是主线程 里 创建
[解决办法]
QWidget(界面控件)不是线程安全的,建议界面都是在主线程中操作即GUI线程,建议楼主放弃这种想法
[解决办法]
发送信号给主线程,在主线程里操作UI。
[解决办法]
QSplashScreen做个启动界面, 注册一个回调函数给你后台时不时的调用用来更新GIF动画,
按你的描述,什么事件信号都是没用的,你连app.exe()都没进,
简单点就直接用QSplashScreen做个静止的画面
[解决办法]线程操作UI明显是不妥当的行为。在Qt 5.1之前的版本线程之间也尽量不要用信号与槽,而要用Event。从5.1开始就可以发信号了。换个新Qt试试?
[解决办法]1,线程刷新或者创建UI会出现崩溃问题,解决方法很简单,就是用信号和槽;
具体操作方法是,
1).定义一个公共单件类(类似ios中的notifycenter)用了发射信号;
2).该类提供一函数供线程调用,在函数中emit信号
3).在界面UI中connect 2中的信号,定义槽函数来实现UI更新或者绘制。
ps:信号和槽是qt很重要的一个通讯工具,已经很成熟了。我目前用的qt版本是4.7.3,工作的很好;
2.gif问题
QMovie *movie = new QMovie(file);
QLabel->setMovie(movie);
movie->start();
#ifndef CLABELWAIT_H
#define CLABELWAIT_H
#include <QLabel>
class CLabelWait : public QLabel
{
Q_OBJECT
public:
explicit CLabelWait(QWidget *parent = 0);
void SetImageFile(QString file);
signals:
public slots:
};
#endif // CLABELWAIT_H
#include "clabelwait.h"
#include <QMovie>
CLabelWait::CLabelWait(QWidget *parent) :
QLabel(parent)
{
}
void CLabelWait::SetImageFile(QString file)
{
QMovie *movie = new QMovie(file);
this->setMovie(movie);
movie->start();
}
ui->label->SetImageFile(":/img/loading.gif");
[解决办法]教你个偷懒的办法,不要开线程,直接在繁重的工作里面加上processEvent(),很方便,但不是个好设计
[解决办法]这个,前边很多人提到了:官方文档也说了,不要在子线程中处理UI。所以楼主不要执著于在
子线程中操作UI.
2,如果要主线程中的UI不阻塞,请使用QApplication::processEvents()
3,线程之间使用signal-slot是非常好的一种选择,比使用postEvent 的方式来说降低了耦合度。