在代码中使用中文的字符串(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)
会将该 object
的 signal
和 slot
变到 thread
的子线程里,也就是我们在如果在某个 connect
里,信号是主线程发出来的,然后槽是这个 object
的,那么 qt 会将 object
的槽放到 thread
的子线程里执行。
但是请注意,子线程必须要开启事件循环 exec()
,才能对这些 connect
的事件进行相应的操作。而 QThread::start()
这个函数并不会开启事件循环!
因此我们必须继承一个 QThread
,改写一下 QThread::run()
,在最后一行加上 exec()
,这样就开启了子线程的事件循环。
QTcpSocket 的 readyRead 的坑
注意,一次 readyRead
信号发出后,socket
获得的数据是永远不会再变了的!无论你怎么 wait
!所以你不可能在一次 readyRead
信号发出的时候,就将整个传输的数据读完(假设数据很大,一次读不完),一直在里面 readAll()
或者 read()
是永远得不到新数据的