Qt / C++常见小问题汇总(二)

22 篇文章 3 订阅

一、简述

在上一篇文章 Qt / C++常见小问题汇总(一) 中讲述了两个小问题,今天就接着这篇讲述三个日常开发过程中会遇到的问题。

问题列表

问题一:

不允许使用不完整的类型 / error C2079: “xxx”使用未定义的 class“XXX”

问题二:

在没有适当 operator()情况下调用类类型的对象或将函数转换到指向函数的类型 / error C2064: 项不会计算为接受 0 个参数的函数

问题三:

LINK : fatal error LNK1104: 无法打开文件“xxx.lib”

下面针对以上几个问题,分析问题原因,并解决之。


二、问题解析

问题一:不允许使用不完整的类型 / error C2079: “xxx”使用未定义的 class“XXX”

这里写图片描述

在我们重写paintEvent事件时,一般会定义一个QPainter类型的对象,但是如果不加上QPainter类的头文件,这里就会报错,一般我们看到不允许使用不完整的类型错误提示时,就要检查一下是否加上了这个类的头文件,或者如果编译遇到下面错误时,就是未加上类XXX的头文件。

TestLibWork.cpp(19): error C2079: “painter”使用未定义的 class“QPainter”


问题二:在没有适当 operator()情况下调用类类型的对象或将函数转换到指向函数的类型 / error C2064: 项不会计算为接受 0 个参数的函数

问题原因:在一个继承Qt基类的类中定义成员变量xxx,而这个基类中存在同名的函数名,导致无法调用此函数。

比如我们在类中定义一个成员变量iconSize(见下图一),而我们自定义的类TestLibWork继承了QMainWindow类,而QMainWindow中提供了成员方法QSize QMainWindow::iconSize()
这里就有了冲突,所以我们在TestLibWork类的某一个成员方法中想要调用QMainWindow 的iconSize()方法时,发现出现了问题(见下图2)。

图一

这里写图片描述

图二

这里写图片描述

当我们命名不规范时或者编码时未注意到这种成员方法名与成员变量名冲突时,当时可能找不到问题的原因,所以为了避免这种低级错误,在定义成员变量时最好是以m_xxx这种格式定义,比如上面的成员变量就可以定义为 m_iconSize,这样就不会冲突,也不会有什么问题了。

以上这种问题一般是新手编码时没有形成良好的编码规范,导致成员方法和变量之间重名冲突,所以良好的编码规范很重要。


这种问题一般是我们项目中需要用到某个lib文件,但是在编译时未找到这个lib文件。

比如我们为当前的项目添加某个lib文件(通过右击项目名称->选择属性->链接->输入->附加依赖项),比如下面我们直接在这里添加LibraryTest.lib

这里写图片描述

然后对项目进行编译,之后我们发现编译失败。错误提示无法打开文件“LibraryTest.lib”,为什么我们添加了这个lib文件,为什么无法打开呢?

原因很简单,因为你没有添加该lib文件的路径。那为什么上面Qt5Guid.lib也没有指定路径也可以用呢?

那是因为他指定了lib文件的路径(见下图)。我们可以看到在附加库目录这一栏中有一项$(QTDIR)\lib,那这个又是什么意思东西呢?QTDIR就是我们系统环境变量,一般装完Qt之后,都会添加QTDIR这个环境变量。

所以(QTDIR)就是获取QTDIR环境变量对应的路径(如D:\Qt\Qt5.8.0\5.8\msvc2015_64),那$(QTDIR)\lib就是Qt5Guid.lib、Qt5Widgetsd.lib这些lib文件的路径了,所以我们自己添加一个lib文件也要指定对应的路径。

这里写图片描述


这里再往下拓展一下,我们现在添加了LibraryTest.lib文件,但是未指定lib文件的目录,但是如何让编译器找到这个lib文件呢,我们可以把lib文件放到工程文件所在目录(见下图),然后就可以成功编译。
这里写图片描述

为什么把lib文件放在这里就可以了,因为这是编译器查找lib文件的默认路径。但是一般我们不会将lib文件放在这里,而是自己新建一个目录,把所有用到的lib文件放在该目录下(如果有多个lib文件需要分类的话,可以在这个目录下再进行分类)。

这里我们新建了LibFiles文件夹,将LibraryTest.lib文件放在此目录下,然后为这个lib文件指定路径。

这里写图片描述


这里指定路径有三种方式。

1、绝对路径

D:\QtPractice\LibraryTest\LibFiles,此方法非常粗暴,为何呢,因为我们如果移动了lib文件的位置,或者整个工程移动到其他电脑上,再次就会找不到这个lib文件,所以此方法慎用。

2、相对路径

一般情况下我们都会用相对路径,因为相对路径不会收到工程位置移动的影响
就上图的lib文件位置,我们可以使用..\LibFiles**指定**LibraryTest.lib文件的位置。
而这里的相对路径,其实也是相对工程文件的目录,所以上文中提到可以将LibraryTest.lib文件直接放到工程文件目录下,不需要添加附加库目录,

3、使用环境变量的方式

此方法上文已经提到过,Qt的lib文件就是利用此方法。
通过QTDIR环境变量指定lib文件的路径,然后通过$(QTDIR)的方式获取到QTDIR环境变量对应的路径值。


今天这篇文章讲解了在日常编码中遇到的一些小问题,对于高手来说,这些小问题一眼就可以看出原因所在,但是对于新手可能不是那么快速解决,所以就此做了点分析,希望对大家有所帮助。

纵观多年的Coding Time,其实会遇到很多问题,这其中有简单,又复杂的,但是有时候就是因为这些问题会困扰着我们好长一段时间。如果第一次我们成功解决了,第二次遇到了同样的问题,很可惜,由于未记录下当时解决的方案或者步骤等或者忘记上次是怎么解决的,导致第二次还是无从下手,这就很尴尬了。

这就是为什么有一定经验的程序员可能对于很多问题都能一眼看破。就比如公司的实习生来问我问题时,基本上我能够立马解决,因为什么呢?是因为他现在走过的坑我曾经都走过,甚至有些坑不止走过一次

正是因为同样的坑走了很多次,所有作为一个程序员,记录问题,总结问题,真的很重要、很重要、很重要!!!

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值