QT的第一个例程-跨线程操作UI错误
2024-05-07
12
0
创建QT一般会有两个示例例程,创建方法这里暂不再说明。如果将来本人良心发现,就补一节。
第一个示例是创建界面即有mainwindows.ui文件的示例:https://c.biancheng.net/view/1817.html
第二个示例是不创建mainwindows.ui示例文件的示例:https://c.biancheng.net/view/9412.html
在第二个列示程,通过在代码中手动增加创建控件,运行结果如下:
其中代码如下:
#include "mainwindow.h"
#include <QApplication>
#include <qlabel.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;//主窗口
//创建标签
QLabel* plabel = new QLabel("站长漫谈-pnpon.com",&w);
plabel->move(100,100);//设置其在主窗口中的位置
plabel->resize(200,30);//设置其大小
w.resize(400,400);//设置主窗口大小
w.show();
return a.exec();
}
不过我们已经有了Windows的开发基础了,肯定不能满足这种搞法。所以就自做聪明的写了如下的代码:
#include "mainwindow.h"
#include <QApplication>
#include <qlabel.h>
#include <windows.h>
DWORD WINAPI ThreadDo(LPVOID lp)
{
QLabel* plabel = ( QLabel*)lp;
for(int i=0;;i++)
{
plabel->move(i%100,0);
Sleep(200);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QLabel* plabel = new QLabel("站长漫谈-pnpon.com",&w);
plabel->move(100,100);
plabel->resize(200,30);
w.resize(400,400);
w.show();
HANDLE h = CreateThread(NULL,0,ThreadDo,(LPVOID)plabel,0,NULL);
CloseHandle(h);
return a.exec();
}
其主要是实现这个标签位置定时来移动。运行后,发现了错误:
这里不得不夸一下MFC,做的真棒。它就不存在这种问题。
这句话大概翻译出来的意思是需在在UI线程中做UI的动作处理。UI线程就是主线程,而我们创建的其它线程是不能进行UI的操作的。
关于这个错误,怎么解决了。这里给出了答案:https://blog.csdn.net/mumufan05/article/details/135140560
不过由于本人对QT暂不了解,也看不懂,先做个标记。后面随着对QT的认知,回过来头再解决