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