Qt4问题集锦
一、Qt程序发布后加载的jpg、jpeg图片不可见
问题的提出:
说明:步骤2中红色路径我QT的安装路径,你的路径可能和我这不一样,请自行更改。
二、运行Qt程序时碰到QWidget: Must construct a QApplication before a QPaintDevice
问题的提出:
之前编译Qwt源码生成qwtd.dll,qwt.dll,然后在工程.pro文件中使用时引入Qwt模块:
DEFINES += QT_DLL QWT_DLL
INCLUDEPATH += C:/QtSDK/Desktop/Qt/4.8.1/mingw/include/Qwt
LIBS += -L"C:/QtSDK/Desktop/Qt/4.8.1/mingw/lib" -lqwtd
LIBS += -L"C:/QtSDK/Desktop/Qt/4.8.1/mingw/lib" -lqwt
结果程序运行时,出现QWidget: Must construct a QApplication before a QPaintDevice
网上搜索的结果是Releases和DEBUG版本的库混在一起了,虽然他们是不同的名字(Debug版本带个d),但是一直不明白。我生成release版后,直接运行.exe时发现提示缺少qwtd.dll库,
此时才发现果然是库的问题,生成release版却调用了debug版的库qwtd.dll。
问题解决:将.pro文件中Qwt模块引入代码改为:
DEFINES += QT_DLL QWT_DLL
INCLUDEPATH += C:/QtSDK/Desktop/Qt/4.8.1/mingw/include/Qwt
CONFIG(debug,debug|release) {
unix|win32: LIBS += -L"C:/QtSDK/Desktop/Qt/4.8.1/mingw/lib" -lqwtd
} else {
unix|win32: LIBS += -L"C:/QtSDK/Desktop/Qt/4.8.1/mingw/lib" -lqwt
}
此时,编译成debug版则只会调用qwtd.dll,而生成release版则只会调用qwt.dll。
三、Qt编写上位机一定要初始化变量以及谨慎操作指针(尤其是QWidget控件指针)
背景:在编写QT上位机界面时,界面在运行的时候经常出现卡死或者直接挂掉的怪现象。
正文:上位机有个函数为check_receive();该函数的作用为定时调用循环检测USB是否有数据。若有,则将信息打印到界面窗体上。界面上有两个QTableWidget窗体
"ui->can1tableWidget与ui->can2tableWidget",根据传上来的的数据某个字节信息为1、或2来打印到对应的窗体上。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
QTableWidget *canselWidget = NULL; unsigned int CANSelCnt; if (CANData.CANSel == 1) { CANSelCnt = 第1个窗体显示的行数; //伪代码 canselWidget = ui->can1tableWidget ; } else if (CANData.CANSel == 2) { CANSelCnt = 第2个窗体显示的行数; //伪代码 canselWidget = ui->can2tableWidget ; } //接着即使用canselWidget来对界面进行操作。 |
接着,总会出现,QT上位机界面直接卡死甚至挂掉的问题。观察现象发现,APP在显示数据窗体时即疯狂地新增新的行数。再研究代码,然后将CANSelCnt打印出来,发现其值为一个很大的随机值。
解决方案:CANSelCnt 在定义的时候要初始化!!!
接着运行上位机发现,APP显示数据窗体不再疯狂的新增行数了。可还是出现挂掉的现象!!
进一步调试才发现若是CANData.CANSel的值不是为1、2那会出现什么情况! 就会对canselWideget这个NULL指针进行操作!更改代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
switch (CANData.CANSel) { case 1: CANSelCnt = 第1个窗体显示的行数; //伪代码 canselWidget = ui->can1tableWidget ; break ; case 2: CANSelCnt = 第2个窗体显示的行数; //伪代码 canselWidget = ui->can2tableWidget ; break ; default : // 防止后续代码对空指针进行操作,直接返回。 return ; } |
总结:
1、此处代码写的非常不小心,犯如此低级的错误却花费了1天多的时间(还以为是下位机没配置好!)!下次一定要把握住程序运行的每个通路,杜绝此现象再次发生。
2、由于之前一直在写下位机代码,所以不赋初值的习惯也带入到这里,出了这次惨痛教训!
(以下讨论仅针对下位机)在下位机,为何会经常出现不赋初值的情况发生。(应该说是在声明的时候不会赋初值。)
首先,最重要的是,下位机保存全局变量的区域为掉电易失区域,所以得到的变量值会为默认"0"值,严谨的做法还是会初始化全局变量。
其次,在多个".c"文件包含一个".h"文件的情况下,若在".h"文件中赋初值,则相当于在其内即声明又定义了,那么编译时,即会出现如下报错:keil *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS (报错信息不完整,只挑了重点部分)。所以说有多个".c"文件需要包含该".h"文件时,不能进行变量的定义,只能进行声明!然后在"main函数"内对其进行初始化操作,否则会出现以上错误,即重复定义!
那么多个"c"文件包含一个".h"文件具体该如何操作呢?
我自己当时的错误想法既是:
在".h"文件内,声明全局变量、函数,譬如uchar aa;void sum(uchar aa); 然后多个".c"文件#include该".h"文件,结局很显然,重复定义错误跑不掉。
何不使用 #ifndef #define #endif ?结果证明并没有什么卵用。
正确的做法是,
在".c"文件内声明全局变量、函数,譬如uchar aa;void sum(uchar aa);,并在".c"文件内实现该函数。
然后,在".h"文件,将变量aa,函数void sum(uchar aa);声明为extern,这样,其他".c"包含该".h"文件即不会提示重复定义,也可以调用其内部的函数。
其实这种做法其实相当于某个需要调用该".c"文件的其他"XXX.c"文件在其文件内 extern 该“.c"文件内实现的函数及定义的变量。若是多个文件需要使用使用,每个".c"文件都需 extern 同样的变量和函数,显然在做重复工作,于是就将它放在一个".h"文件,多个".c"文件需要调用时直接包含该".h"文件就可以实现 extern 了。
总之,要养成良好的编程习惯,编写下位机时最好不要在.h文件去定义一个变量,更不能在.h文件去初始化变量。变量定义与初始化在.c文件进行,若多个外部.c文件需要调用,则在.h文件中添加extern进行外部声明即可。
Qt4问题集锦的更多相关文章
- Qt之qt4.7 和qt 4.8.4 交叉实践
开发机环境搭建: 测试环境:CentOs7.1 Ubuntu 12.0.4 操作流程: 一.编译Qt4.7.0 1)CentOS上实践 1.tar xzvf qt-everywhere-openso ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- Android之常见问题集锦Ⅱ
Android问题集锦Ⅰ:http://www.cnblogs.com/AndroidJotting/p/4608025.html EditText输入内容改变事件监听 _edit.addTextCh ...
- Visual Studio问题集锦:coloader80.dll未正确安装
问题 今天在修改之前的一个项目的时候报了一个错,大概内容如下: 有一个 Visual Studio 的 DLL 文件(coloader80.dll)未正确安装.请通过"控制面板"中 ...
- Eclipse for Java EE软件操作集锦(二)
看本文章之前请确保已经了解eclipse建立web工程,如果有疑问请查看本系列文章第一篇 eclipse软件操作集锦(一) 1.我们添加一个servlet 配置一下web.xml测试一下是否能正常显示 ...
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- C/C++面试题集锦(一)
C/C++面试题集锦(一) */--> C/C++面试题集锦(一) 在类的头文件中进行声明然后在定义文件中实现有什么意义? 一方面使类的实现只编译一次,提高编译效率:另一方面可以实现类的接口和实 ...
- Ubuntu16.04 VTK7.1.0+QT4.8.6+QtCreator开发环境配置
VTK需要OpenGL3.0或更高版本的驱动,但虚拟机下的Ubuntu不支持OpenGL3.0,或者自己按网上教程配置之后也能支持,但过程相当繁琐,本人试验失败. 最终决心采用双系统,装好之后,执行g ...
- VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4
对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...
随机推荐
- windows10如何将python2和python3添加到环境变量中
点击我的电脑----->右键‘属性’----->高级系统管理-------->高级-------->环境变量------>新建------->此时输入变量名和变量值 ...
- [webapp]ios safari 正确使用js跳转
在safari上,以往屡试不爽的location.href = url; 变得不好用了.使用该方法跳转到新的网页,无法使用后退按钮回到上个页面.想想也是,直接修改值得方式跳转总是怪怪的,但是从刚学网页 ...
- 负载均衡@StackExchange.Redis实现Session外置--纯干货喂饱你
Redis和StackExchange.Redis redis有多个数据库1.redis 中的每一个数据库,都由一个 redisDb 的结构存储.其中,redisDb.id 存储着 redis 数据库 ...
- Linux入门基础(七):Linux软件管理基础
源代码形式 绝大多数开源软件都是直接以源代码形式发布 源代码一般会被打包成tar.gz的归档压缩文件 程序源代码需要编译成为二进制形式之后才能够运行 源代码基本编译流程 : ./configure 检 ...
- Bailian 2808 校门外的树(入门线段树)
题目链接:http://bailian.openjudge.cn/practice/2808?lang=en_US 总时间限制: 1000ms 内存限制: 65536kB 描述 某校大门外长度为L的马 ...
- Http protocal
https://tools.ietf.org/html/rfc2616 1. 状态码:status code 1xxx:信息--请求被接收,继续下一步处理 2xxx:成功--请求行为被 ...
- 006 --MySQL索引原理
一 .索引的概念? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化 ...
- c++ 使用this指针进行串联的函数调用
如代码所示,在每个成员函数函数体最后返回*this.即可实现串联调用. class Time { public: Time(, , ); Time &setHour(int); Time &a ...
- Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建
原文地址:石匠的blog truffle是一个基于Javascript开发的一套智能合约开发框架,使用Solidity语言编写合约.truffle有一套自动的项目构建机制,集成了开发,测试和部署的各个 ...
- Hyperledger Fabric(v1.2.0)代码分析1——channel创建
Hyperledger Fabric(v1.2.0)代码分析1--channel创建 0. e2e_cli Hyperledger Fabric提供了一个e2e的例子,该例中创建了一个基础的区块链网络 ...