QT攻略——我在QT中遇到的那些坑

 

 

(1)QUdpSocket接收数据

进入槽后,要用这种方式读取,否则可能会导致不发readyRead()信号 。
while(udpSocket->bytesAvailable())
{
udpSocket->readDatagram(ch,size);
}

(2)QTcpSocket删除

一定要用deleteLater
一定要用deleteLater
一定要用deleteLater
否则会导致用户对象溢出

(3)运行文件附带调试输出窗口

CONFIG += console pro
配合->http://github.com/851896022/QLog

(4)可以在pro文件中写上标记版本号+ico图标

VERSION = 2019.08.08
RC_ICONS = main.ico

(5)解决socket传输后等中文乱码

转成base64传输
QByteArray(QString.toStdString().data()).toBase64()

(6)QT连接MySql后,长时间无操作(默认8小时)会断开。

isOpen()等函数无法判断,需执行sql语句才能发现失败
QSqlDatabase.setConnectOptions("MYSQL_OPT_RECONNECT=1");
↑断开后可自动重连

(7)在槽使用sender()函数可获取到发出信号的对象的指针。

(8)子线程中使用QAxWidget不成功,原因是在QApplication的主线程中,会自动初始化COM库,而新开辟的子线程不会自动初始化COM库,所以需要我们手动来初始化。

//添加头文件
#include <windows.h>
//在线程开始的时候初始化COM库:
HRESULT r = OleInitialize(0);
if (r != S_OK && r != S_FALSE)
{
qWarning("Qt:初始化Ole失败(error %x)",(unsigned int)r);
}
使用结束后需要释放掉:
OleUninitialize();

(9)file.write()以后调用file.flush()避免数据在缓存中未成功写入。

(10)延时。

{
QEventLoop loop;
QTimer t;
connect(&t,SIGNAL(timeout()),&loop,SLOT(quit()));
t.start(1000);
loop.exec();
}

(11)别用QWidget布局,别问我怎么知道的。

(12) 对QLCDNumber控件设置样式,需要将QLCDNumber的segmentstyle设置为flat。

(13)QTimer::singleShot 计时器单次触发,有时会有意想不到的效果

(14)QByteArray 有toHex 有fromHex 有toBase64有fromBase64

posted @ 2019-10-24 12:59  付润豪  阅读(2310)  评论(0编辑  收藏  举报
欢迎访问我的博客