Qt 笔记

2018-09-04  框架  ,,  1,624

在代码中使用中文的字符串(C++11)

u8"这是中文"

Qt5 + MSVC2017 中文报错"常量中有换行符"

将所有文件保存为 UTF8 + BOM 的格式即可

Qt Creator 双开两个程序(实例)

Tools -> Options -> Build & Run -> General -> Stop applications before building 里的 Same Project 改成 None 即可

QDataStream 的一些坑

QByteArray data;
QDataStream st(&data, QIODevice::WriteOnly);
st << int(0);
qDebug() << st.size()

这输出的绝对不是 sizeof int!因为 QDataStream 有一套自己的数据存储协议,类似 json 一样吧

QTcpServer 获得的 nextPendingConnection 不能被 moveToThread

将获得的 nextPendingConnection 进行 setParent(nullptr) 即可...

Qt 中的多线程与事件循环

假设我们有一个 QThread *thread

qt 里的 object.moveToThread(thread) 会将该 objectsignalslot 变到 thread 的子线程里,也就是我们在如果在某个 connect 里,信号是主线程发出来的,然后槽是这个 object 的,那么 qt 会将 object 的槽放到 thread 的子线程里执行。

但是请注意,子线程必须要开启事件循环 exec(),才能对这些 connect 的事件进行相应的操作。而 QThread::start() 这个函数并不会开启事件循环!

因此我们必须继承一个 QThread,改写一下 QThread::run(),在最后一行加上 exec(),这样就开启了子线程的事件循环。

QTcpSocket 的 readyRead 的坑

注意,一次 readyRead 信号发出后,socket 获得的数据是永远不会再变了的!无论你怎么 wait!所以你不可能在一次 readyRead 信号发出的时候,就将整个传输的数据读完(假设数据很大,一次读不完),一直在里面 readAll() 或者 read() 是永远得不到新数据的

欢迎留言>_<

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据