欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-28 22:07:10
(1)QUdpSocket接收数据 进入槽后,要用这种方式读取,否则可能会导致不发readyRead()信号 。while(udpSocket->bytesAvailable()){ udpSocket->readDatagram(ch,size);} (2)QTcpSocket删除 一定要用del ......

 

 

(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

(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