Qt教程
+ -

QT的第一个例程-跨线程操作UI错误

2024-05-07 4 0

创建QT一般会有两个示例例程,创建方法这里暂不再说明。如果将来本人良心发现,就补一节。
第一个示例是创建界面即有mainwindows.ui文件的示例:https://c.biancheng.net/view/1817.html
第二个示例是不创建mainwindows.ui示例文件的示例:https://c.biancheng.net/view/9412.html

在第二个列示程,通过在代码中手动增加创建控件,运行结果如下:
145329883582
其中代码如下:

#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,做的真棒。它就不存在这种问题。

145707195869
这句话大概翻译出来的意思是需在在UI线程中做UI的动作处理。UI线程就是主线程,而我们创建的其它线程是不能进行UI的操作的。
关于这个错误,怎么解决了。这里给出了答案:https://blog.csdn.net/mumufan05/article/details/135140560
不过由于本人对QT暂不了解,也看不懂,先做个标记。后面随着对QT的认知,回过来头再解决

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!