- 博客(100)
- 资源 (3)
- 问答 (2)
- 收藏
- 关注
原创 一个 .cpp 引发的编译错误惨案
正在我一筹莫展的时候,领导发现了问题所在,原来 IMachine 这个类作为一个接口类,居然有一个 IMahine.cpp 文件,而该文件中只存在一个析构函数的实现,再无其他内容。正在一切就绪的时候发现好多的错误,刚开始以为是没有引用头文件目录找不到,然而在看到 pro 中对引用后就知道不是这个问题。奇怪的是在 Windows 下编译运行也是正常的,按照这种逻辑想下去完全没有头绪。
2024-04-23 09:02:01
440
原创 Qt 运行 Android 程序时找不到 Toou2D 库闪退
将编译生成的 Toou2D 文件夹拷贝至 D:\software\Qt\5.15.2\android\qml 目录下。程序闪退,错误信息如下,找不到库。
2024-04-23 09:00:00
371
2
原创 Qt Android 动态加载动态库失败
经过了七七四十九个劫难后程序终于稳定运行起来了,正当我以为完美时,问题又找上门了,QML 里面的二维码图片加载不起来了,这个图片还不是本地图片,是实时生成的。开始的时候并没有下面日志输出,我以为是 dynamic_static 转转失败了,让我一顿疯狂的找错误,当我加上加载错误时输出错误日志才恍然大悟,是缺少了库。在 UPCNC3.pro 中添加 websockets 模块。
2024-04-23 08:59:01
413
原创 Qt Android 申请写文件到内部存储
在项目中我们有一个软件配置文件,在软件更新一些配置后需要将配置信息保存到配置文件中,Windows 下是将配置文件保存到软件当前目录下,但是 Android 环境下无法保存到程序当前目录,最终只能将配置文件保存到内部存储中(平板的存储器)。Android 写文件是需要申请权限的。
2024-04-22 11:27:09
884
2
原创 Qt Android 无法加载 assets 目录下 lua 校准脚本
项目的校准脚本在打包的时候都放在 assets 资源目录下,但是 assets 是压缩包,Android 下虚拟目录,所以 Qt 可以加载 assets 目录下文件,但是 C 语言的 fropen 函数却无法打开。为了实现这个目的,需要修改原有的逻辑,程序在运行时将判断该存储器中是否存在校准脚本,如果不存在则从 assets 资源目录下复制过来。为此只能将所有的脚本文件移动到内部存储器中保存,然后从内存存储器中加载校准脚本可以使用。C 语言使用 fopen 无法打开 assets 目录下的文件。
2024-04-22 11:25:59
774
1
原创 QML 中引用 js 文件闪退问题
在移植 Android 中遇到这样一个引用兼容性问题,起因是这样的,Windows 版本的采用了 QML 分离的方式加载,而 Android 版本又采用了 qrc 的方式。而 Qt 中的机制是采用 QML 分离方式时则使用相对路径的方式引用 js 文件,而采用 qrc 的方式则需要使用 qrc 的方式引用 js 文件。且两种方式不能同时使用。在项目开发时使用了 Windows 下 QML 分离的方式加载,在 qml 文件中使用相对路径的方式引用了 js 文件,在 Android 环境下编译运行时程序闪退。
2024-04-19 15:21:20
620
1
原创 程序闪退,找不到 Toou2D 模块
本来该目录存在 Toou2D 模块,但是由于修改过,导致我一直以为没有问题,后来将原来的删除掉,再将重新编译后的目录复制进去就可以了。Qt 安装目录下的 D:/software/Qt/5.15.2/android/qml 下更新 Toou2D 模块。
2024-04-19 15:19:35
346
原创 dynamic_cast 跨模块使用失败
模块中进行转换时会失败,在本模块中没有问题。转换失败,最终确认是因为跨模块的原因。由类内部提供接口转换后返回。
2024-04-19 15:18:39
479
原创 无法正确显示语言和语言切换
项目中使用 ts 语言文件,语言文件是放在 assets 资源目录下的。通过跟踪发现是设置进去的路径错误的,由于 `Android` 下设置的是 `assets` 相对路径,所以通过 `QUrl` 无法转换成绝对路径。
2024-04-18 13:12:22
237
原创 导致程序崩溃删除的地方
环境下直接不重定向日志,经过后期调试应该是 dynamic_static 转换失败导致。由于 Android 下没有创建文件和写文件的权限,所以导致程序崩溃。直接判断 Android 环境下返回 0。
2024-04-17 09:36:00
872
原创 Toou2D 的 TIconButton 不显示
我将 Toou2D 示例代码中 TIconButton 的例子拿过来是可以显示出来的,但是和项目中代码有较大的区别,只能一点点测试是什么原因导致。windows 下已基本完成了 UPCNC3 的功能开发,显示部分已经完成,但是移植的时候发现 TIconButton 根本显示不出来。在 svg.cso 文件中开头增加精度语句。
2024-04-16 09:09:20
556
原创 通过新建方式移植 CNC3 项目
尝试过很多种方式,Android 下都会闪退,没有办法的情况下只能以归零的心态取搞,直接新建一个项目,项目结构除了 UI 部分的放在 UPCNC 子项目下,其他不变。这样就可以慢慢的从头开始调试,经过半天的折腾,项目框架搭建完毕,并将原来的 QML 界面相关资源加载到新项目中并顺利的让程序运行起来,这样第一步就基本完成。将 QML 部分代码移植过来之后会发现界面中无法加载的图片资源,其原因是 Android 下查找资源的方式不一样。设置完下面的内容之后需要重新构建,直接运行可能无法将资源拷贝进去。
2024-04-16 09:07:43
295
原创 Qt for Android 配置 gradle
配置 gradle 版本在 Qt Android 编译时需要配置对应的 gradle 版本才能正确编译。
2024-04-15 11:20:08
2738
3
原创 Qt for Android 开发环境
在搭建环境时开始感觉还挺顺利的,从 Qt 配置的环境里面看并没有什么问题,可真正编译程序的时候发现全是错误。最开始的时候安装了 JDK21 最新版本,然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle,但是不管这么搞都会有编译错误。然后在换成 JDK20,依然不行,最后换到 JDK18 的时候终于可以了。需要注意的是还需要搭配正确的 gradle 版本和 gradle 插件版本。
2024-04-15 11:15:10
904
原创 项目移植介绍
Windows 版本开发基本完成后考虑在安卓平板上运行,所以首先使用 Qt Creator 对项目进行适配,然后再对移植到平板上运行。公司做了一下项目,我们平时就叫 CNC3,用于控制单个或多个加工机,而我们的加工机则是用来切削各种牙齿的。
2024-04-15 10:21:01
281
原创 模板函数与模板类
在合适的场合使用函数模板能够大大的提升开发的效率,例如经常使用的一个例子,求两个数的最大值。就目前使用的方法中,最大值求法有很多种,如宏定义、重载、模板。宏定义求最大值的做法也会经常见到,但是宏定义不会安全检查,如果稍微有点错误就难以发现了。可以考虑使用模板替代宏。
2024-01-22 19:45:00
130
原创 运算符重载
重载使得类变得更加方便使用,在重载时也要注意一些细节。在重载运算符时,要尽量去贴合类的常用使用习惯,而不是看有什么运算符全部重载。需要选择适合类的重载运算符。有些运算符最好要成对实现。对于单目运算符最好使用成员函数方式重载,对于双目运算符最好使用友元函数方式重载。尽量减少构造临时对象。
2024-01-19 19:30:00
146
原创 C++ 中 static 应用
在C/C++中都可以使用static关键字,但是却需要注意在C与C++的使用方法有差异。C++除了继承C中static的使用方法外还增加了新的使用方法。本次实验主要介绍static在C++中的使用方法。静态的成员在实例化对象之前已经产生,并将数据存放在全局(静态)存储区。在C++中主要新增有静态数据成员和静态成员函数两种使用方法。公有静态数据成员可以看做是作用于在类中的全局变量,而私有静态数据成员虽然其他的类无法访问,但是类的所有对象将共享该数据。而静态的成员函数可以看做全局函数来使用。静态成员函数没有。
2024-01-17 19:30:00
147
原创 友元函数与友元类
使用过Qt的同学相信都了解Qt库内部也使用了很多友元类,Qt封装了大量的类库,里面很多库是有关联性的,所以在使用的时候直接使用友元的方式,比较简单快速的解决了问题。友元函数或友元类不受权限关键字的约束,可以在类内任意位置。可以直接访问类的所有成员,包括私有成员。友元函数或者友元类破坏了类的封装性,建议少用或者不用。友元关系不可传递,即友元类的派生类不再是友元类。友元关系是单向性的,如示例代码 3 中Circle类可以访问Point类,但Point类不能访问Circle类。
2024-01-16 00:10:07
337
原创 C++ 异常处理
异常便是程序中数据出现不合理的特殊情况处理,在做项目时我们常常需要想到的是特殊的情况,只有将所有的特殊情况处理好之后程序才能很好的运行。
2024-01-10 21:26:46
510
原创 RTTI(运行时类型识别)
RTTI需要以继承为基础。RTTI基类中需要有虚函数或者纯虚函数。RTTI使用typeid和来实现。需要注意在基类向派生类转换时可能会失败。
2024-01-08 21:16:50
744
原创 虚函数以及实现原理
多态可扩展行和易维护性的实用性,如果有新类型的任务时直接继承基类实现即可,并且和其他任务类型是相似的,实现起来非常方便。维护时也只需要检查相应任务类即可。提高了开发效率。实现多态的关键在于虚函数表。多态用在合适场景能提高开发效率。使用多态也有一定的限制,必须在继承时并且有类似任务时,即合适场景时使用。
2024-01-01 18:16:42
808
原创 论虚继承的作用
菱形继承是继承中一种特殊的继承,如图中类B和 类C都继承自类A,而类D又同时继承类B和类C,这样就产生了一个菱形继承,如下图。通过本小节实验,需要学习菱形继承以及菱形继承所产生的问题。学习虚继承的使用场景以及虚继承的使用方式。在实际开发中,菱形继承可能使用的并不是很多,但是一旦用到便需要注意使用虚继承。实际项目开发中,如果使用IDE环境框架,在使用现有框架的时候就要注意一下,因为现有框架很多是经过了多重继承。在开发中,最好不好使用这么复杂的继承关系。
2024-01-01 18:13:25
945
原创 多继承与多重继承
多继承与多重继承是实际开发中常会用到的,需要深入学习理解。多继承与多重继承比较好理解,但注意不要混淆这两个概念。多重继承尤为常见,在实际开发中,使用的很多框架基本都是经过了多重继承。
2023-12-25 19:39:03
453
原创 继承中的关系
使用基类作为参数传递时,直接传递产生临时变量,会耗费时间空间,而引用和指针传递不产生临时变量,所以推荐使用引用的方式作为参数传递,相对来说指针比较复杂所以不在推荐之列。临时变量调用拷贝构造函数,使用时需要注意。可以从截图中发现传递不管是基类还是派生类,其调用的都是Person类的eat函数,这也是为什么叫做isA。当派生类对象传递给基类参数时,其本质是构造一个基类对象或者使用派生类对象中基类部分。无法重载,只能隐藏,即只要同名就隐藏,而不管参数类型与个数。
2023-12-25 19:35:13
866
原创 C++ 继承方式
类的成员属性和继承方式组合后有多种访问方式,需了然于心。继承方式有public、protected、private三种,有四种写法,因为还有一种默认继承的方式。一般情况不使用默认继承的方式,直接明确继承方式,方便阅读。开发中使用public继承方式较多。
2023-12-25 19:32:39
993
原创 C++ 开发中为什么要使用继承
生活中继承是指孩子继承父亲的财产等。C++使用了这一思想,却又与生活中的继承不一样。在使用继承时,派生类是基类的子集,基类是派生类的超集,例如人类与学生类,人类是一个大的概念,学生首先是人类,其次才是学生,所以学生类可以继承人类。如果两个没有任何关系的类不存在继承关系。C++继承中,将被继承的类称为基类或者父类,将继承的类称为派生类或者子类。文章中将统称基类和派生类。被继承的类称为基类或者父类。继承的类称为派生类或者子类。继承时需要使用权限关键字public, protected或者private。
2023-12-18 22:03:22
512
原创 Makefile 应用
linux和windows下Makefile中都使用 “#” 注释。linux下使用rm命令删除文件,windows下使用del命令删除文件。本章节简单的说明了两个Makefile应用场景,但是其强大的功能远非如此。学习完本章节后,后续的课程中将使用Makefile脚本来编译程序,进而巩固Makefile的使用。
2023-12-18 22:01:09
891
原创 const 应用
const允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const。const对象只能调用const成员函数,不能调用普通成员函数。const指针和const引用对象都只能调用对象的常成员函数。普通成员函数与const成员函数可以互为重载。普通对象能调用const成员函数,也能调用普通成员函数。常对象只能调用const成员函数,不能调用普通成员函数。普通对象和const对象都可以访问公有数据成员。
2023-12-13 23:48:29
926
原创 深拷贝与浅拷贝
如果不实现拷贝构造函数,系统将自动生成,并且只能做浅拷贝。如果类中存在申请内存操作时一定要重载拷贝构造函数。类中存在指针数据成员时需要使用深拷贝。
2023-12-11 22:51:45
482
原创 对象与对象数组
使用对象数组时会调用每个对象的构造函数和析构函数。new与deletenew []与delete []一定要配套使用。不要越界,不管是栈还是堆,访问数组时都不要越界。对象数组指针变量本身就是一个指针。堆上实例化的数组,要注意指针使用方法。如果是做项目,要考虑使用在堆上实例化申请内存,栈空间比堆空间小很多。当对象A中有常量时必须使用初始化列表。当对象A有其他的对象B并且对象B没有默认构造参数时需要使用初始化列表。除了以上两种情况,可以不使用初始化列表,但是推荐使用初始化列表。
2023-12-11 22:49:34
864
原创 对象的生离死别
作为C++开发者,必须对内存的分区以及使用了然于心。一个好的构造函数、拷贝构造函数和析构函数可以使程序使用更加稳健。在编写构造函数时需要考虑是否使用explicit关键字修饰。推荐在编写程序时使用初始化列表的方式初始化参数。析构函数时要注意释放堆中的内存,但也要注意避免重复释放内存造成程序崩溃。
2023-12-11 22:11:17
978
原创 浅谈类的封装
封装是类的本身属性,类就是将需要的数据以及函数放在(封装)类内部,使用该类实例化的对象可以使用类内部的数据和函数,通常来说学习一样东西只要问三个问题就可以了。
2023-12-07 22:09:37
1061
原创 头文件应包含什么,不应包含什么?
文章知识点来自《大规模 C++ 程序设计》。当程序具有规模的时候,编译、链接的速度跟包含的头文件有很大的关系,我们需要知道头文件中应该包含什么,不应该包含什么。
2022-09-22 10:26:10
515
原创 Qt for Android 控制台程序编译报错
Qt for Android 控制台程序编译报错环境系统:window11Qt 版本:Qt5.15.1安卓调试机:RK3399ProX编译错误说明Qt 创建了一个简单的界面程序,可以调试运行到开发板上。Qt 创建了一个简单的控制台程序,编译的时候报错了。错误信息:Skipping D:/software/Qt/5.14.2/android/plugins/platforms/libplugins_platforms_qtforandroid_armeabi-v7a.so due to un
2021-11-24 14:33:18
2351
3
谁有搭建好的 QT for Android 环境的虚拟机,可以提供一个下载链接吗?
2021-11-18
通过 WIFI 连接到局域网,ping 主机名为 IPv6 是怎么回事?
2021-10-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人