- 博客(427)
- 收藏
- 关注
原创 Qt常用容器之:QMap
一、QMap概述QMap是Qt(跨平台应用程序开发平台)的一个关联容器,用于存储Key-Value键值对。它类似于STL的map,但有所不同。它是模板类,可以存储任意类型的数据,并且支持自定义排序规则。QMap的用法简单易懂且非常有用,它可以应用于许多领域,如图形界面、网络编程等。它可以存储任何类型的数据作为键和值,并且提供了快速查找、插入和删除操作。
2024-03-29 10:35:33 330
原创 Qt常用容器之:QVector
QVector 是 Qt 容器类库中的一个重要组成部分,它提供了类似于 C++ 标准库中的 std::vector 的功能,但同时拥有 Qt 独特的优势。我们的目标是帮助读者充分了解 QVector 的优势和局限性,从而在实际项目中做出明智的选择。在计算机编程的世界中,数据结构是一个核心概念,它为我们提供了有效地组织和存储数据的方法。QVector 是 Qt 框架中一个用于存储数据的容器类,它可以存储各种类型的数据,如整数、浮点数、自定义类等。以上是 QVector 的常用接口的详细介绍。
2024-03-28 17:57:03 467
原创 QT中的 容器(container)简介
这些容器类比STL(C++标准模板库)容器设计得更轻量、更安全并且更易于使用。如果对STL不熟悉,或者倾向于用“Qt的方式”,那么你可以使用这些类,而不去使用STL的类。(STL容器使用详见首页其他作品)Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项。比如,你需要一个大小可变的QString的数组,则使用QVector<QString>。
2024-03-28 17:50:02 160
原创 Qt常用容器之:QList
在开始讲解 QList 之前,我们先明确一下 Qt 数据容器能存储什么,不能存储什么。Qt 提供的数据容器都是模板类,构造时要带数据类型,比如下面这句定义整型数列表:Qt 数据容器有支持的数据类型,也有不支持的类型,不仅是 QList ,其他数据容器都有不支持的数据类型。存储在 Qt 数据容器里面的数据,必须是可赋值类型!比如 C++ 基本数据类型,int、double、指针等可以存储在 Qt 数据容器里;
2024-03-28 17:35:50 668
原创 Model模型的:插入 和 删除
除所有偶数行,这将有可能使用beginRemoveRows和endRemoveRows达到150万次之多,1、要使模型能插入行/列和删除行/列,子类需要重新实现以下虚函数: insertRows();数),该函数会通知其他组件(比如视图或委托)行数将要发生变化,完成插入操作之后,还。2、下面以 insertRows()虚函数为例,讲解其规则(其余函数,原理类同)()函数(称其为 end 函数)以通知其他组件,该模型的行数已经更改,,比如若有一个有 300 百万行的模型,需要删。2.更新模型结构的内部数据。
2024-03-28 17:12:00 164
原创 Qt定时器类QTimer
2. 在大多数情况下,建议将定时器连接到QObject::startTimer()函数,并在哪里实现`timerEvent()`事件,这种方式能够避免多个计时器事件同时达到时可能引起的不稳定现象。要使用它,只需创建一个QTimer类对象,然后调用其 start() 函数开启定时器,此后QTimer对象就会周期性的发出 timeout() 信号。4. 如果QTimer的间隔设置过小,也可能会出现定时器的不稳定性,所以在应用程序需要精细定时的情况下,应小心使用QTimer。//每间隔一秒向控制台发送一条信息。
2024-03-28 16:04:07 246
原创 Qt智能指针--QScopedPointer
QScopedPointer和C++中的智能指针std::unique_ptr其概念是一样的,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确地删除。但它有更严格的所有权,并且不能转让,一旦获取了对象的管理权,你就无法再从它那里取回来。而使用T *QScopedPointer::take()也是返回对象指针,但QScopedPointer不再拥有对象所有权,而是转移到调用这个函数的caller,同时QScopePointer对象指针置为NULL。
2024-03-26 15:38:16 252
原创 QDialog的成员函数exec() 的返回值
如果希望在按钮按下后让QDialog::exec()返回QDialog::Accepted或QDialog::Rejected,可以使用QDialog::accept()和QDialog::reject()函数。在这个示例中,当用户点击“登录”按钮时,如果用户输入有效,则调用accept()函数,让QDialog::exec()返回QDialog::Accepted。否则,调用reject()函数,让QDialog::exec()返回QDialog::Rejected。// 处理用户点击了取消按钮的逻辑。
2024-03-21 10:01:10 261
原创 uart、串口、COM口、USB口,ttl,rs232,rs485这几个是什么关系?
受限于本文篇幅,还有更多关于串口、COM、UART、USART、RS232、RS485、RS422、TTL细节讲解的内容,私信作者或者关注公众号,回复230218,获取对应的资料。我们前面讲过,UART、USART、TTL、RS232、RS485、RS422有不同电平特性,那么,这些设备互联正常通信的首要条件是必须电平匹配,否则,轻则功能不正常,重则烧板子,烧芯片。受限于本文篇幅,还有更多关于串口、COM、UART、USART、RS232、RS485、RS422、TTL细节讲解的内容,请在文末获取...
2024-03-20 10:12:25 686
原创 VS2015不能 调试中编辑呢?
警告 LNK4075 忽略“/EDITANDCONTINUE”(由于“/SAFESEH”规范) TAppEncoderC:\chenglei\FME\HM-16.0-FME-lab\build\vc10\encmain.obj1。对于/RELEASE:这里就不用多说了吧,编辑并继续无法在release模式下使用。好了,现在重新生成项目,然后试试看,是不是可以使用“应用代码更改”了呢?b、忽略“/EDITANDCONTINUE”(由于“xxxx”规范)对于这两种警告,MSDN给出了解释(
2024-03-19 14:43:14 240
原创 QLibrary:加载动态库
项目中需要对操纵手柄进行读取,在网上找了几篇博客,基本都是依赖winmm.lib,但其中一篇直接加载它的动态库,从里面把函数解析出来,虽然麻烦,但还是眼前一亮,竟然可以这么做!一般只有对某个dll非常熟悉,知道dll中包含哪些函数、函数参数个数及类型、返回值类型才使用这种方式加载并调用函数,否则,还是使用头文件+lib的方式调用函数。由于不太熟悉typedef的这种操作,一开始没看懂,后来查了下,这是使用typedef定义的函数指针,并简单整理了这篇文章。,通过resolve进行解析,resolve。
2024-03-17 19:41:41 355
原创 C语言自定义数据类型:用typedef声明新类型名
除了可以直接使用 C 提供的标准类型名(如 int,char,float, double 和 long 等)和程序编写者自己声明的结构体、共用体、枚举类型外,还可以用 typedef 指定新的类型名来代替已有的类型名。并不是用 “ Num[10] ” 去代替 “ int ”,而是采用如同定义变量的方法那样先生成一个类型名(就是前面介绍过的将原来的变量名换成类型名),然后用它去定义变量。简单地说,就是按定义变量的方式,把变量名换上新类型名,并且在最前面加 typedef,就声明了新类型名代表原来的类型。
2024-03-17 17:35:34 492
原创 VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决
机器上装有Qt5.12.9和Qt5.12.2,以及Qt5.7,因为不同的工程使用的Qt不一样,所以工程中Qt版本没有匹配,我里工程使用Qt5.7。选择后会弹出如下窗体,选择编译机器版本msvc2015 64即可(如果是单纯的qt项目,可以直接选择出现的自己qt版本)如果上述修改后,问题仍然没有解决。那么先将Qt Versions的名称删掉,之后重新命名一个不同的名称!一般是直接将工程复制到另一台电脑上所导致,系统可能默认不选择使用的qt版本。右键工程——qt——convert project to。
2024-03-17 14:03:36 397
原创 Win7 VS2015+Qt5.9 编译出现MSB3758 MSB4036 NMAKE : fatal error等各种错误问题记录
解决方式:首先升级qt-vsaddin到支持VS2015的最后一个版本qt-vsaddin-msvc2015-2.4.3,然后升级.NET Framework到4.7及以上,这里用的是4.7.2,参考原文链接:https://blog.csdn.net/xinhuahappy/article/details/108645112。3.1 升级qt-vsaddin,下载qt-vsaddin-msvc2015-2.4.3。1、第一种错误(error MSB3758、error MSB4036)
2024-03-17 13:53:14 263
原创 VS项目属性: Target Platform Version 和 Platform Tool Set
这个解释里只是提到这个属性指定了 “用于构建项目的 Windows SDK 的版本号”,还说什么如果指定了新的Windows版本的SDK,而程序运行在更早的Windows版本,程序运行时要检测一下当前运行的 Windows 版本,把旧版本 Windows 不支持的一些功能禁用掉。按字面上理解,就是肯定了这样的实践——如果我指定使用 Windows 10 的 SDK 10,运行在 Windows 7 系统上的话,要注意不去调用 Windows 10 支持而 Windows 7 不支持的接口。
2024-03-15 12:55:17 633
原创 DeleteFile(szFilePath)失败,之后再对文件操作,造成崩溃
1.如果不再对szFilePath1文件进行操作 + DeleteFile()函数执行失败=》也不会造成 软体崩溃!2.如果后续需要对szFilePath1文件进行操作 + DeleteFile()函数执行失败=》就会。所以,如果后续需要使用,必须要对DeleteFile()函数 返回值,进行检查!
2024-03-14 17:59:50 193
原创 QThread常用相关函数、线程启动方式
但是,线程可能会立即被终止也可能不会,这取决于操作系统的调度策略,使用terminate()之后再使用QThread::wait(),以确保万无一失。线程的起点,在调用start()之后,新创建的线程就会调用这个函数,默认实现调用exec(),大多数需要重新实现这个函数,便于管理自己的线程。该函数返回后,线程便执行结束,就像应用程序离开main()函数一样。使用terminate()函数,线程可能在任何时刻被终止而无法进行一些淸理工作,因此该函数是很危险的,一般不建议使用,只有在绝对必要的时候使用。
2024-03-14 15:53:40 521
原创 QT中connect()的参数5:Qt::DirectConnection、Qt::QueuedConnection区别
Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。
2024-03-11 15:39:18 651
原创 QSettings
用户通常希望应用程序能够记住其跨会话的设置(窗口大小和位置、选项等)。此信息通常存储在 Windows 上的系统注册表中,以及 macOS 和 iOS 上的属性列表文件中。创建 QSettings 对象时,可传递公司或组织的名称以及应用程序的名称。QSettings 的 API 是基于 QVariant 的,可以让用户便捷地保存大多数基于值的类型,例如 QString、QRect 和 QImage。QSettings 是对这些技术的抽象,使用户能够以可移植的方式保存和恢复应用程序设置。
2024-03-11 14:51:48 340
原创 QT: 获取CPU序列号、硬盘序列号、主板序列号 (采用wmic命令)
很强大,在win10上系统上wmic命令被powershell的“ help Get-WmiObject ”代替,但是wmic 命令还是正常可以使用的。创建新进程: wmic process call create "C:\Program Files\Tencent\QQ\QQ.exe"通过wmic 命令获取CPU序列号、硬盘序列号、主板序列号、CPU名称等信息。查询cpu序列号: wmic cpu get processorid。查看cpu详细信息: wmic cpu list brief。
2024-03-11 14:21:55 723
原创 工厂 模式
工厂模式分为三种(简单工厂模式,工厂方法模式,抽象工厂模式)参考原文链接:https://blog.csdn.net/flyingcloud6/article/details/131352604一、为什么要使用工厂模式?主要是对对象的创建进行了一个封装;因此也属于创建型模式。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择的问题。一个调用者想创建一个对象,只要知道其名称就可以了;
2024-03-07 16:32:32 978
原创 嵌入式系统是什么?Linux应用开发是开发什么的?
嵌入式系统嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。嵌入式系统与通用计算机系统的本质区别在于系统应用不同,嵌入式系统是将一个计算机系统嵌入到对象系统中。这个对象可能是庞大的机器,也可能是小巧的手持设备,用户并不关心这个计算机系统的存在。嵌入式系统一般包含嵌入式微处理器、外围硬件设备、嵌入式操作系统和应用程序4个部分。嵌入式领域已经有丰富的软硬件资源可以选择,涵盖了通信、网络、工业控制、消费电子。
2024-03-06 11:00:06 634
原创 嵌入式 Linux 开发的基本概念 及 学习路线
以往的学习路线通常是:裸机--->u-boot--->内核移植--->驱动开发--->根文件系统--->APP 开发。这样的学习路线一开始就耗费大量时间来学习各种复杂琐碎的细节知识,效率低下,所以应该跳过裸机和u-boot,直接从应用开发入门,自顶向下学习,先快速掌握嵌入式 Linux开发的大致方法和过程,等有需要了再深入学习。① 在 Windows 上阅读、研究、修改(使用 Source insight 会很方便),修改后上传到 Ubuntu(使用 Filezilla)(简单地说,工具链就是编译器)
2024-03-06 10:17:47 448
原创 linux嵌入式开发是什么
一些常见的Linux发行版如Buildroot、OpenWrt、Yocto Project等,它们针对嵌入式系统进行了优化,具有更小的存储空间和更快的启动时间。2. 设备驱动开发:嵌入式系统中的各种硬件设备(如传感器、显示屏、网络接口等)需要相应的设备驱动程序来进行控制和访问。6. 系统调试与优化:在开发和部署嵌入式系统时,系统调试和性能优化是必不可少的步骤。通过使用调试工具、性能分析工具和日志跟踪工具,开发者可以找出系统中存在的问题和瓶颈,并进行优化和改进。
2024-03-06 10:07:46 218
原创 并发编程中常见的设计模式,c++多线程如何设计
类 Unix 的操作系统中创建进程的 API 是 fork(),传统的 fork() 函数会创建父进程的一个完整副本,例如父进程的地址空间现在用到 了1G 的内存,那么 fork() 子进程的时候要复制父进程整个进程的地址空间(占有 1G 内存) 给子进程,这个过程是很耗时的。没有修改操作,也就是保持了不变性。如果在某一段业务高峰期的时间里生产者“生产”任务的速率很快,而消费者“消费”任务速率很慢,由于中间的任务队列的存在,也可以起到缓冲的作用,我们在使用MQ中间件的时候,经常说的削峰填谷也就是这个意思。
2024-03-01 10:05:38 1160
原创 控制器和驱动器的区别是什么
而驱动器则是一种电气或者机械器件,它的主要作用是控制电机、活动部件等运动控制,使得机器按照特定的轨迹和速度工作。在实际生产和工程应用中,控制器和驱动器通常是一体化的系统,相互协调配合,以实现对机器的精确控制和驱动。控制器通过芯片或者单片机实现对机器的控制和监测,根据输入的数据和指令,对输出控制信号进行判断和调整,实现对机器的各种运动控制。而驱动器主要是通过电子电路和机械传动系统实现对电机等动力机构的驱动控制,在机器运行过程中,根据控制器输出的信号,对终端执行部件(电机、执行器、阀门等)进行驱动和控制。
2024-02-29 15:08:55 318
原创 2-3 树
2-3 树作为一种平衡查找树,查询效率比普通的二叉排序树要稳定许多。但是2-3树需要维护两种不同类型的结点,查找和插入操作的实现需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找树更慢。
2024-02-27 18:03:19 521
原创 算法为什么难=》领悟学习方法论
原文参考:为什么算法这么难???_过程_逻辑_时候广大码农同学们大多都有个共识,认为算法是个硬骨头,很难啃,悲剧的是啃完了还未必有用——除了面试的时候。实际工程中一般都是用现成的模块,一般只需了解算法的目的和时空复杂度即可。不过话说回来,面试的时候面算法,包括面项目中几乎不大可能用到的算法,其实并不能说是毫无道理的。算法往往是对学习和理解能力的一块试金石,难的都能掌握,往往容易的事情不在话下。志于高者得于中。反之则不成立。另一方面,虽说教科书算法大多数都是那些即便用到也是直接拿模块用的,但不幸的是
2024-02-27 11:19:54 719
原创 红黑树(RBTree)BST,的性质与操作
(Binary Search Tree, BST),由于基于二叉查找树(并不是基于 AVL 树 ),因此它是有序的。红黑树和 AVL 树很像,都是为了让二叉查找树能保持平衡,不会退化成链表,让查找时间复杂度能够稳定在 O(log(n))。,当拥有相同数量的节点时,红黑树的层数可能会比 AVL 树高,3、由于红黑树的结构比较复杂,因此它也比较难理解,但我们可以。2、红黑树 和 AVL平衡二叉查找树的区别,有什么不同?基于 AVL 树(平衡二叉查找树))!2.1 相比 AVL 树,红黑树。
2024-02-26 15:13:25 126
原创 STL用法
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。
2024-02-24 13:22:17 767
原创 常见的10种算法
Hash,一般翻译做散列、杂凑,或音译为哈希,是一个典型的利用空间换取时间的算法,把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。如有一个学生信息表:学生的学号为:年纪+学院号+班级号+顺序排序号【如:19(年纪)+002(2号学院)+01(一班)+17(17号)---à190020117】类似于一个这样的信息,
2024-02-24 12:08:53 846
原创 迭代 与 循环的区别、迭代和递归的区别
迭代和循环的效率都取决于循环的次数和执行的代码。在循环次数相同的情况下,迭代的效率通常比循环低,因为迭代需要根据上次执行的结果来进行下一次执行,而循环的执行结果是相同的,不需要进行额外的计算。在一些编程语言中,迭代和循环的语法是不同的,例如Python和Ruby中的迭代语法和Java和C++中的循环语法是不同的。从概念上来看,迭代强调的是根据上一次执行的结果来进行下一次执行,而循环强调的是每次执行的结果都是相同的。从实现的方式上看,迭代的执行次数是不确定的,而循环的执行次数是确定的。
2024-02-23 17:46:55 285
原创 遍历的三种算法——递归、非递归、层次
原文链接:https://blog.csdn.net/weixin_46432495/article/details/120497774。
2024-02-23 17:43:42 229
原创 递归 与 非递归(迭代)
在1.1什么是递归中我们举了两个例子,照镜子和山上有座庙故事的例子,我们发现这两个例子都是死循环,会无休止地递归下去,这样地函数是我们需要避免写出来地,因为计算机的资源是有限的,如果递归的层次过深,就会造成"爆栈"的风险,如果不能理解什么是"爆栈",没有关系,你可以先认为递归层次过深,内存会发生溢出。第三步,找到递推公式,我们经过分析,发现需要先将1号盘至n-1号盘移动到B柱上,其中C柱作为辅助柱,然后将最大的盘--A柱n号盘,从A柱移动到C柱上,最后将B柱上的1号盘至n-1号盘移动至C柱上。
2024-02-23 16:17:06 649
原创 二叉排序树(Binary Sort Tree)/二叉查找树(Binary Search Tree)/亦称二叉搜索树
原文链接:数据结构-二叉排序树(图文详细版)-CSDN博客
2024-02-22 18:15:11 259
原创 字符和数字的相互转换,数字和字符串的相互转换
此程序先输出a[0],即程序中的1,i控制循环次数,控制在字符串的长度,其次用算式解决字符串1357变成数字的输出,进行第一次循环,先输出1,而num=0,所以式子变成010+‘3’-‘0’=3,即输出13,进行第二次循环,式子变成310+‘5’-‘0’=35,即输出135,以此循环将字符串a变为数字。原文链接:https://blog.csdn.net/weixin_55661707/article/details/114798935。@c++[TOC]字符和数字之间的相互转换,数字和字符串的相互转换。
2024-02-22 15:39:36 219
原创 平衡二叉树(AVL):,“平衡”是指什么?为什么要“平衡”?
也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的。如 LR 型最后的根结点为原来的根的左孩子的右孩子,RL 型最后的根结点为原来的根的右孩子的左孩子。只不过 AVL 树在删除节点后需要重新检查平衡性并修正,同时,删除操作与插入操作后的平衡修正区别在于,插入操作后只需要对插入栈中的弹出的第一个非平衡节点进行修正,而删除操作需要修正栈中的所有非平衡节点。对于删除操作造成的非平衡状态的修正,可以这样理解:对左或者右子树的删除操作相当于对右或者左子树的插入操作,然后再对应上插入的四种情况选择相应的旋转就好了。
2024-02-22 13:35:23 997
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人