初次实践QT遇到的问题和解决方法

听说QT很好玩,画界面简单并且跨平台,本猿试用了一下,做了一个简单的com通信程序,串口可传递消息和文件。
遇到了一些qt的问题,分享如下。欢迎讨论!(都是干货,比很多QT文章有用。)

1.qt界面控件的自动水平扩展。第一步把控件设置为格栅化。不要选窗体内布局,虽然也可以达到目的,但是QT Designer会给你自动化排列,破环你的layout。第二步设置sizePolicy=Expanding或MiniExpanding,如果要防止缩小太过,再设置一下MiniSize大小。这是本猿及其欣赏的功能,强过MFC界面好多倍。

2.QThread其实是依附在主线程的,仅仅用于管理工作线程。run()函数中的代码才是一个单独的线程,或者使用movetoThread()方法把Qthread同工作线程绑到一起去。所以千万不要在QThread.start()同一级调用wait(),只会是主线程阻塞,让你的GUI界面失去响应。通过movetoThread将工作线程绑定后,工作线程的process来处理业务。而当process结束后,线程其实并没有结束。通过发送finished()结束一个线程,或者调用quit()&wait()结束线程。

3.qt的信号和槽机制非常方便实现了对象直接的通信。但是要主要他们的连接方式。分两大类同步方式和异步方式。缺省情况下采用autoconnect,即同一个线程内部同步调用,不同线程入线程队列异步调用。这个非常容易理解。但是要注意几点,第一是异步线程如果处于死循环状态而无法接收到signal,这是可以通过direction直连方式解决问题;第二是异步线程到GUI主线程采用直连方式性能更快,但是直连SLOT中不能有控制的操作。这个可以通过先直连不同线程的两个信号,然后在连接同一线程的信号和槽的方法解决。总之,仔细考虑信号和槽的连接方式和他们对应的线程情况,可以写出性能相当不对代码。

4.qt信号和槽传递参数时,支持qt基本的数据结构传递,比如int,double,QString,QByteArray等,但是引用&是不支持的。如同用户自定义数据一样,都需要通过qRegisterMetaType声明为元数据来传递。信号和槽函数都可以同名重载的。槽函数传递的参数分值传递和引用传递,引用传递可以在槽函数中修改参数值从而影响信号中的实参。事实上对于槽函数的参数传递,QT都会产生一个新的实例,即便是引用传递。如果你传递了一个自定义的对象,比如MyString,无论值传递还是引用传递,执行时都会构造一个新的实例,在槽函数结束时释放,唯一不同的是对于引用会把新实例的值赋值给形参。

5.qt信号和槽修改后可能会出现编译不过的情况,这是QT moc导致的问题,一般情况下选择重新build即可。这个可能是QT的一个bug。qt信号和槽连接时,如果你在信号或槽里面添加了参数名,build能够通过但是SLOT永远都不会执行,所以必须把参数名删除只留下参数类型。这也是QT的一个bug。

6.qt的信号和槽在界面开发方面应用方便,但是必然带来性能问题,在不影响用户体验的情况下,还是可以接收的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值