【QT开发】一些零碎知识

1.乱码

QTextCodec *codec = QTextCodec::codecForName("GB18030");
setWindowTitle(codec->toUnicode("我是中文"));

2.QTimer 调用start后,如果槽函数时间比start的实参数值大,那么start直到上次执行的函数返回才能继续调用槽函数。


3.用QThread开启线程时,在run函数末端记住调用this->exec()函数,这样在线程中信号槽机制才生效。所以在run函数一般的代码都是:new对象,connect信号槽然后就是this->exec(),进入qt的事件循环当中。

特别注意:接受信号线程(也就是槽实现的线程)如果正常进入事件循环,那么发送端(信号实现线程)发送所来的信号,接收端能被及时更新;但如果是没有进入事件循环的线程接受到信号,那么是不会被触发的,也就是相当于线程不知道有信号。  ---2016.09.29


4.qt有一些控件自带刷新,有一些则不是。比如,在子线程创建一个下载文件的对象,这个每下载一部分内容后要更新一个QProgressBar控件,在while(true)中发送信号通知主线程更新界面,注意,此时子线程并不返回到事件循环exec().界面线程的QProgressBar能及时更新状态。但对于一些其他控件如label用类似方法则不会更新,一定要返回到事件循环exec()中,界面线程才被通知更新。


5. 在使用跨线程信号时,如果信号和槽的对象指针均属于一个线程的对象,那么这个信号槽是不跨线程的,即时第五个参数使用了Qt::QueueConnection。


6.在主线程结束子线程QThread时,先subthread->exit(),再调用subthread->wait()等待线程结束与资源回收。


7.Qt在debug模式下run和单步执行在变量初始化之间有差别,run下默认初始化为0,而在单步执行下初始化为非0.,!需要谨记的是:使用变量前一定要初始化,不然在不同模式下运行将会是一个很大的坑。


8. 使用QThread时,要退出线程使用exit,之后一定要调用QThread->wait等待退出,不然直接delete线程有时会造成崩溃。 --2016.09.29


9. 界面只能由界面线程创建,特别地,QMessageBox这类提示窗口也是,也是只能由GUI线程创建。 --2016.10.07


10.使用信号槽机制时,需要做两件事,继承Qt对象、声明Q_OBJECT。 --2016.10.07


11.发送信号时,如果槽函数和信号函数是处于同一线程,那么相当于直接调用槽函数。 --2016.10.07


12.由于11条例,单线程下是允许传递 引用 类型,但多线程若要传递引用,则只允许 常量引用 类型,为什么呢?因为一个信号可以连接多个槽函数,如果参数是T &话会不会第一个槽函数改变参数的值,然后第二此调用的参数就已经不是信号发出的值?

--2016.10.07




你可能感兴趣的:(C/C++)