Qt之初学者遇坑杂谈


前言

本篇博客仅仅只是记录本人一边学习Qt一边应用的时候遇到的坑,有些坑非常简单,但是由于本人当时Qt知识面太窄,掉坑了。后面遇到Qt的坑都会更新记录到本篇博客中。有些相关知识可能涉及东西较多,会单独拿出来记在其他博客中,然后在这里说明掉坑的原因和简述解决办法后附上链接。


1.Qt多线程多线程未启动成功

Qt的多线程链接和信号槽链接

在做一个项目的时候,启动Qt的多线程去进行数据处理,由于第一次使用Qt的多线程,想着直接继承Qthread,直接start就完事了。后来发现没启动成功,而且编译不会给报错,没启动原因是因为当时那个线程类继承了QWidget,不能实例化对象后,调用start开启新线程。

所以对于程序问题,有多线程一定要考虑多线程是否会启动成功,可以打印线程的ID,查看线程ID是否是一个新线程ID,包括线程内的槽函数、run函数所在线程的ID。直接在槽函数或者run函数内调用下面的方法即可,返回的是函数执行时所在线程的ID。

   QThread::currentThreadId()

二、Qt的槽函数运行时所在的线程

这个问题就是因为,如果线程启动方法不合适的话,槽函数执行时所在的线程并非是实例化对象新启动的线程。
列如下面这个例子:

class QtThreadTestSing :public QObject 
{
	Q_OBJECT
signals:
	void emitPrint();
};

class QtThreadTest2 :public QThread
{
	Q_OBJECT
public:
	void run() {
		qDebug() << "this is QtThreadTest2 run():" << QThread::currentThreadId();
		while (1) {
			qDebug() << "do something in run";
		}
	}
public slots:
	void Print() {
		qDebug() << "this is QtThreadTest2 Print():" << QThread::currentThreadId();
		QThread::sleep(1);
	}
};



//main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << "main Thread:" << QThread::currentThreadId();

    QtThreadTest2 t2;
    t2.start();//执行run

    QtThreadTestSing ts;
    QObject::connect(&ts, &QtThreadTestSing::emitPrint, &t2, &QtThreadTest2::Print);
    ts.emitPrint();//发送信号

    return a.exec();
}

运行结果:
在这里插入图片描述
这个槽函数执行就不在子线程里,而是在主线程里。主要原因是这样起线程的话,槽函数执行时所在线程会在run函数所在线程的依赖线程。依赖线程按照我的理解意思是,在主函数里利用"对象.start()"的方式启动了线程,那么主线程就是该线程的依赖线程。所以槽函数会在主线程里执行。并不是对所有线程都这样,主要看写多线程的方式。多线程和信号槽这一部分内容较多,总结到了另一篇博客中。
Qt的多线程链接和信号槽链接

三、Qt的连接错误

在这里插入图片描述
类似出现Qt链接错误这种问题,当时自己搜索了很久,网上有很多解决办法,一般出现链接问题,按照其他csdn博主写的解决办法就可以解决了。但是最终都没解决我的问题。当时是测试用例,直接将类写在了主函数里,后来才发现,将类单独写到.h文件里就好了。出现这个问题的原因是将类写成主函数里不会编译生成moc_文件,就不会链接到类里面的一些方法。
如果发现单独将类写了一个.h文件里,还是出现moc_类似的链接问题的话,而且按照其他csdn博主提供的解决办法仍没有解决,且类的.h文件没有对应的.cpp实现文件的话,就将类的成员函数的方法的实现给放到.cpp文件里,再重新编译。

四、Qt的UI操作

待总结更新…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟小胖_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值