Qt项目中出现的问题小结
写在前面: 总结这个星期自学Qt踩过的一些坑,并不包含所有问题,仅仅是基于自己所做的小界面而言
1. Qt中文乱码
描述:
Qt项目文件中中文乱码?qDebug()打印的中文乱码?
解决方法:
-
如果是Qt Creator
直接点这个,
然后会出来:
选择utf-8编码即可。
-
如果是VS + Qt(拓展)
在使用中文字符的地方加上:#pragma execution_character_set("utf-8")
即可
2. 关于Qt调用vs编译的dll控件
个人建议:如果有这个需求,就不要用仅凭Qt Creator进行开发了,不是Qt Creator不行,我相信网上面肯定有很多方案用Qt Creator调用dll控件,但是我认为,这时候使用vs + qt(拓展)是最好的,否则,运气不好会遇到很多版本问题。
如果你在Qt Creator中隐式调用dll出现一些奇怪的报错,请考虑以下两点:
- 头文件路径包含是否正确
- Qt Creator不行就换vs+qt(拓展)
3. 关于动态链接库导出类与函数的使用
-
函数:网上一大堆我之前总结过=>
-
类:重点是对导出类的使用
只需要包含类所在的头文件即可直接使用,不需要任何其他操作!
如果包含了该类头文件后,运行出错,请考虑文件的路径问题。
4. 关于动态链接库隐式调用的两种操作
方法一:
-
把* .lib或者 *.a文件和 *.dll文件和xxx.h文件复制到当前项目目录下(非必要)
-
点击项目->属性->链接器->常规->附加库目录:输入* .dll和* .lib目录,然后
在项目->属性->链接器->输入->附加依赖库: 添加* .dll
方法二:
-
把* .lib或者 *.a文件和 *.dll文件和xxx.h文件复制到当前项目目录下(非必要)
-
先在使用dll的源文件中地方加上:#pragma commet("lib ", "lib的路径")
然后在项目->属性->链接器->输入->附加依赖库: 添加* .dll
5. VS+Qt(拓展)打不开xxx.ui文件
解决方法:
右键点击xxx.ui文件,选择打开方式,将原先的默认方式取消,将另一个qt design(改一下名字,比如把中间的空格除去得到qtdesign)设为新默认。
6. 关于自定义控件的提升
简单控件:用一个类即可,xxx* h和 xxx* cpp实现
复杂组合控件: 用一个qt设计师(qt creator)/qt类(vs+qt), xxx* h, xxx* cpp, xxx* ui
点击任意一个ui文件并编辑,右键->提升的窗口部件,就能看到哪些已经被提升了,然后选择基类,将类名xxx填入,点击全局包含,全局包含点开后,在其他ui地方就可以用这个提升了。
关于取消提升,只有当前项目所有文件都不依赖该提升类时,才可以将其删除,删除方式与添加相似,打开那个界面之后,选择之前提升的类,点击减号(这时候减号是亮起来的,并显示未被使用)
7. 关于按钮形状、颜色的设定
使用stylesheet编辑样式表
8. 子窗口的移动问题
无论是:我这个小窗口,怎么不是嵌入在主窗口里面?明明加了弹簧,怎么鼠标还可以动?加了setparent啊?还是: 我这个窗口怎么才能随着鼠标拖动啊?
就是就一个问题:鼠标点击事件的设置mousexxxEvent的重写,能被拖动就看看这个,肯定是重写了这个事件,不能随鼠标拖动,就加上这个事件的重写。
9. 关于封装而引起的事件响应问题
比如一个自定义按钮类,他是通过重写鼠标的监听即重写mousexxxEvent来实现贴图的切换,点一下:贴图变成"开", 再点一下贴图变成"关",这样的话,把这个按钮做一个提升,假设继承的基类为QPushButton,那么用connect连接点击信号,和一个槽函数,那么,可以告诉你的是,你点击鼠标,显示的开关贴图会变,没问题,但是槽函数不会执行!!!因为贴图挡住了,这个点击信号被你自己重写的mousexxxEvent函数给捕捉了,所以即便是自定义按钮继承的QPushButton类,里面有clicked这个信号,也不会被触发!
解决方法:移除自己重写鼠标的监听即mousexxxEvent,将这个捕捉鼠标点击信号的任务让出来,然后connect鼠标点击信号(QPushButton继承下来的) 和 新建槽函数(内容为原来mousexxxEvent中的内容即可),然后都可以通过这个一个捕捉信号来,比如转换开关的贴图,以及开关对应的功能。
10. 关于Qt的绘图问题
主要学习QPainter类,顺带学习QPen、QColor、QBrush等等类
- 画出图形draw系列:
画点、线、弧、图、扇
- 画笔Qpen系列:
画笔调控:粗细、颜色、实虚线
-
totate旋转、translate移位…
-
绘图的坐标系
-
数学计算…
11. 关于Qt定时器的使用
QTimer *time = new QTimer;//实例化计时器
connect(time, &QTimer::timeout,[=](){
//........ 计时器一到设置的时间就触发信号,开始做某事
});
time->setInterval(600);//设置计时器为600ms,每600ms触发一次
time->start();//开始计时
12. 我对于Qt的一点看法
Qt是一个与c++搭配默契的GUI图形库,除了基本的图形界面外,还可以用于网络通信,也可以用于操作数据库,甚至拓展Opencv图像处理,值得大家一学。别的语言搞图形化界面我不太清楚, 但是对于c/c++,这类语言来说,反正比easyx强太多了!
THE END…