
Qt开发
文章平均质量分 58
记录Qt的开发的一些学习知识和开发体会以及经验。
很多是记录一些学习的轨迹。
零点零一
Make it right before you make it faster. Keep it right when you make it faster. Make it clear before you make it faster. Do not sacrifice clarity for small gains in efficiency. -- Brian Kernighan
展开
-
Qt/c++类型转换总结
而dynamic_cast是一种在运行时期进行类型转换的动态转换操作符,适用于在继承关系中进行向下转型,具有类型检查的能力,但可能具有运行时开销。是 C++ 中的一种强制类型转换操作符,它允许将一个指针或引用转换为不同类型的指针或引用,即使它们之间没有直接的关联。这种转换是不安全的,因为基类对象可能并不是派生类对象,所以需要进行类型检查来确保转换的安全性。的使用应该非常谨慎,因为它是一种非常底层的转换,很容易导致类型错误和未定义行为。需要注意的是,这种转换不进行任何类型检查,因此需要确保转换的安全性。转载 2024-11-02 09:54:50 · 136 阅读 · 0 评论 -
系统地介绍Qt的QtConcurrent模块
QtConcurrent是Qt框架中的一个高级多线程编程模块,它提供了一组高层次的API,旨在简化多线程编程的复杂性。通过QtConcurrent,开发者可以轻松地实现任务的并行化,提高程序的执行效率和响应性。QtConcurrent是Qt框架中用于简化多线程编程的一个强大工具。通过提供高层次的API和自动管理线程的生命周期和同步问题,QtConcurrent大大降低了并发编程的复杂性。原创 2024-11-02 09:31:49 · 886 阅读 · 0 评论 -
重写QObjiet虚函数timerEvent()启动定时器
请注意,这个例子中使用了Qt的调试输出功能,因此需要在编译时启用Qt的调试信息输出,以便在控制台中看到定时器触发的消息。启动定时器是一个常见的方法,它允许在Qt应用程序中实现定时功能。下面是一个简单的例子,展示了如何重写。你可以根据需要调整定时器的触发间隔和处理逻辑。函数中,我们检查了触发的定时器ID,并编写了相应的处理逻辑。函数启动了一个定时器,每隔1000毫秒(1秒)触发一次。函数中,你可以编写定时器事件的处理逻辑。函数来停止定时器,以避免内存泄漏。在构造函数中,我们使用。的类,并在该类中重写。原创 2024-10-19 13:51:06 · 191 阅读 · 0 评论 -
使用 QThreadPool例子
函数中,我们首先获取全局线程池实例,并设置其最大线程数为5。然后,我们创建一个循环,在循环中创建新的。方法将它们添加到线程池中。线程池将自动调度和执行这些任务。会自动删除任务对象。因此,你不需要(也不应该)在任务完成后手动删除它们。方法等待所有任务完成,并在完成后输出一条消息。成员变量,用于标识任务,以及一个重写的。在这个例子中,我们创建了一个名为。方法,该方法包含任务的实际代码。请注意,当任务完成时,原创 2024-10-19 12:19:46 · 207 阅读 · 0 评论 -
Qt C++ 编程中定义了一个槽函数(slot)deleteLater的作用
可以确保对象在合适的时候被安全地删除,例如在一个操作完成后或者当对象不再被需要时,在事件循环处理完当前的事件队列后再进行删除操作。比如,一个网络请求完成后,对应的处理对象可能不再需要。当一个对象在某个操作过程中可能正在被其他对象引用或处于一个关键状态时,如果直接删除可能会导致程序出现错误或不稳定的情况。是一个非常有用的函数,它会安排接收对象在事件循环返回后被删除。这样可以在特定的时间点触发对象的清理操作,确保资源的合理释放。,在这个函数中执行一些操作后,通过发出。,安排对象在合适的时候被删除。原创 2024-10-17 09:08:41 · 460 阅读 · 0 评论 -
linux kill命令的参数差别和一个根据文件名杀死进程的sh解释
kill 39813 和kill -9 39813 有啥差别?在Linux系统中,kill命令用于向进程发送信号。kill 39813和的主要差别在于发送的信号不同,这会导致对目标进程的处理方式不同。原创 2024-10-17 17:33:34 · 431 阅读 · 0 评论 -
如何在堆和栈上分别创建一个`QObject`子类对象
在Qt中,是许多Qt类和对象的基类,提供了对象模型的核心功能,如信号和槽机制、事件处理等。当一个对象在堆上创建时,意味着这个对象是通过操作符在堆(heap)内存区域分配的,而不是在栈(stack)上自动分配的。这样做有几个原因,包括延长对象的生命周期、在复杂的应用程序中更好地管理对象间的父子关系等。下面是一个简单的例子,展示了如何在Qt中在堆上创建一个对象,并将其设置为另一个对象的子对象。注意:在Qt中,在堆上创建一个对象通常意味着你使用操作符来分配内存,并返回一个指向该对象的指针。这样做的好处是你可以控原创 2024-09-22 17:41:47 · 893 阅读 · 0 评论 -
QT的工程文件解读
如果 `qtsingleapplication-uselib` 宏未定义,或者 `qtsingleapplication-uselib` 宏定义为0,则执行 `{...}` 中的语句;`QT += module`是表示链接Qt模块库的操作,而`QT *= network`是附加一个值到QT宏中,即添加网络模块到原有的QT值中,其效果和`QT += network`相同,只是两种写法的语法略有不同。寻找更优解,在Qt中,QT宏定义作为Qt库的主要组成部分,用于头文件包含、链接库依赖和QT宏的定义等。原创 2023-06-12 14:56:51 · 989 阅读 · 0 评论 -
QT Qprocess封装线程执行
同时,使用信号和槽连接OutputReady信号和槽函数来实现实时输出程序的输出内容。为了避免在主线程中执行比较耗时的操作,可以使用Qt的线程模型将MyProcess这个类运行在单独的线程中。这样便实现了将MyProcess类的执行过程移动到一个单独的线程中,实现了线程的分离和异步执行,提高了程序在多核CPU上的执行效率,同时避免了在主线程中执行比较耗时的操作导致程序阻塞。我们将MyProcess类继承QObject并重载了它的`run()`函数,将程序的启动和等待的操作都放在了这个函数里面。原创 2023-06-08 14:17:32 · 816 阅读 · 0 评论 -
linux环境下QT使用QProcess 关闭程序
stopProcess()方法会先发送SIGTERM信号终止进程,然后等待进程完全终止。如果不调用waitForFinished(),那么可能会导致进程没有完全终止就被关闭。在Ubuntu中可以使用kill命令来终止进程。为了在Qt代码中使用kill命令,可以通过继承QProcess类来实现。这里使用了自定义的MyProcess类继承QProcess,并添加了stopProcess()方法来实现终止进程的功能。调用第三方程序,调用完后需要终止。//调用需要终止的程序。// 发送SIGTERM信号。原创 2023-06-08 13:39:33 · 5496 阅读 · 0 评论 -
Qt扫盲-QProcess理论总结
然后,你可以调用write()来写入进程的标准输入,并调用read()、readLine() 和 getChar() 来读取标准输出。finished()信号提供了进程的退出代码和退出状态作为参数,你还可以调用exitCode()来获得最后一个已经完成的进程的退出代码,调用exitStatus()来获得它的退出状态。如果在任何时间点发生错误,QProcess将发出erroroccurs()信号。你还可以调用error()来查找上次发生的错误类型,调用state()来查找当前进程的状态。转载 2023-06-08 11:20:32 · 937 阅读 · 0 评论 -
Qt 项目文件Pri详解
在Qt中,Pri文件是一种项目文件,用于将C++代码、JavaScript文件、资源文件等链接在一起,并生成可执行文件。Pri文件中可以定义编译规则、链接规则、生成规则、部署规则等等,通过使用不同的变量和函数,来实现各种复杂的构建流程和部署流程。Pri文件是基于Makefile语法的,因此需要使用一定的Makefile知识。原创 2023-06-03 15:22:21 · 9253 阅读 · 0 评论 -
valgrind基本功能介绍、基础使用方法说明
拷贝效果不好,请看原文。1、Valgrind概述Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。原创 2023-06-01 17:38:48 · 1749 阅读 · 0 评论 -
Qtcreator 创建 新文件时名字大小写的设置
Qtcreator 创建 新文件时名字大小写的设置。原创 2023-05-30 14:11:02 · 999 阅读 · 0 评论 -
在ubuntu系统,用QTestLib 做Qt单元测试,请给我一个入门的教程例子
QTest::qExec()` 函数的第一个参数是测试类的指针,指向我们的测试类的对象 `test`,第二个和第三个参数是 `main()` 函数的标准参数。`QTest::qExec()` 函数的第一个参数是测试类的指针,指向我们的测试类的对象 `test`,第二个和第三个参数是 `main()` 函数的标准参数。我们可以在测试开始前使用 `setUp()` 函数设置测试环境,在测试结束后使用 `tearDown()` 函数清除测试环境。// 运行所有测试用例。// 定义测试结束后的函数。原创 2023-04-19 10:37:19 · 1146 阅读 · 0 评论 -
基于 Ubuntu 系统使用 Google Test 框架编写 Qt C++ 单元测试的详细教程
然后,将测试代码目录添加到编译目标中,并链接Google Test库文件(注意:链接库文件时需要添加`-pthread`参数)。在 Qt Creator 中创建一个新的控制台应用程序项目,名称为 `MyTest`,目标文件类型选择`Relaese`, 填写好项目的相关信息和路径,创建项目后在项目根目录下创建名为 `test` 的子目录,用于存放测试代码和测试数据。在 `test` 目录下创建一个新的 C++ 文件 `mytest.cpp`,编写测试代码。# 添加 Google Test 框架库文件目录。原创 2023-04-19 10:26:54 · 861 阅读 · 0 评论 -
在linux系统,用QT开发环境,C++语言,做共享库工程如何做?
在完成共享库的开发后,您可以将其部署到其他应用程序中,并在需要时动态加载它。为此,您需要将生成的共享库文件放置在适当的文件夹中,并将相应的链接选项添加到应用程序的编译器选项中。注意,生成的共享库文件需要放置在指定的路径下,并在需要使用该库的程序中通过编译选项将其链接到程序中。1. 打开QT Creator,选择“新建项目”,在“非QT项目”下选择“库”;3. 在弹出的对话框中填写库的基本信息,如库的名称、版本号、作者等。2. 选择您想要创建的共享库类型,例如:动态共享库或静态共享库。原创 2023-04-19 10:10:07 · 732 阅读 · 0 评论 -
QT常用全局宏定义 QT定义的一些有用的宏QMessageLogger
#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug#define qInfo QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).info#define qWarning QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_转载 2023-04-06 10:34:57 · 172 阅读 · 0 评论 -
QT下的线程池的使用方法
最后提一点就是Qt为每个QApplication创建了一个线程池对象,通过QThreadPool的静态成员函数globalInstance()可以获得这个对象。是的因为这个线程池的最大线程数是4。线程池维护一定数量的线程,并充分使用它们。Qt封装的线程池类是QThreadPool,它的使用需要QRunnable来配合。但线程也不是创建越多越好,因为创建、销毁线程以及切换线程都是需要消耗资源的。2.调用QThreadPool的start()开始工作,start的参数就是子类化QRunnable的指针。转载 2023-03-04 13:28:21 · 1307 阅读 · 0 评论 -
Qt 之 QFileSystemWatcher+封装类
同样,当一个目录或它的内容被修改或删除时,会发射directoryChanged()信号。QFileSystemWatcher检查添加到它的每个路径,已添加到QFileSystemWatcher的文件可以使用的files()函数进行访问,目录则使用directories()函数进行访问。当目录被修改(例如:在指定的路径中添加或删除一个文件)或从磁盘删除时,这个信号被发射。然而,变化的序列中的最后的变化总会发射这个信号。如果路径存在,则添加至文件系统监控,如果路径不存在或者已经被监控了,那么不添加。转载 2023-02-18 13:48:58 · 438 阅读 · 0 评论 -
QApplication::processEvents的使用
有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态。例如:在应用程序中保存文件到硬盘上,从开始保存直到文件保存完毕,程序不响应用户的任何操作,窗口也不会重新绘制,从而处于“无法响应”状态,这是一个非常糟糕的体验。当我们需要在执行这个耗时程序或函数时不断的刷新界面就可以使用QApplication::processEvents函数,一边执行程序一边刷新界面,就会给人一种很流畅的感觉。,即在子线程中处理文件保存,主线程负责界面相关。转载 2023-01-31 17:26:25 · 4262 阅读 · 0 评论 -
当Qt(C++)中,function成为first-class
我对C++的使用和理解是不断变化的。从一开始的C with Class 到接触到设计模式,才理解了什么叫真正的OOP;从接触到STL才真正正视Template,了解了什么是GP;从Python和Golang的火热中了解了函数作为first-class的力量;从某些文章对Lisp近乎玄学的推崇中知道了FP的优势和它逐渐在主流的编程方式中兴起的原因。C++是包容和自由的,自从学了std::function和lambda之后,我也开始逐渐学着向FP方式转变。转载 2023-01-31 17:14:30 · 296 阅读 · 0 评论 -
QT中宏__FUNCTION__ 之类的作用
今天需要用到debug,想到还得写文字,就想偷个懒,制作了两个宏定义,如下,以后需要的地方直接调用宏定义就好。定义两个的原因是写msg默认值时候,会报错,为了简便,就定义两个。转载 2023-01-31 16:47:58 · 759 阅读 · 0 评论 -
Qt之QtConcurrent无需使用低级线程原语编写多线程
由于两个函数非void函数,但是返回QString在各个方法里面并未出现所以会出现崩溃。不在出现crashed。原创 2023-01-31 16:25:07 · 591 阅读 · 0 评论 -
Qt 只运行一个程序实例的实现技术点
Qt 只运行一个程序实例 -QLockFile -QSystemSemaphore 和 QSharedMemory_mb611488a787387的技术博客_51CTO博客前言每次只运行应用程序的一个实例可能是必要的,以限制内存泄漏的问题,或者消除某些资源,文件,SQLite数据库等应用程序的两个实例之间的竞争问题。或者,原则上,应用程序只需要用户使用一个副本就行了。有两种方法可以用来解决这个问题:1、使用QLockFile当一个临时文件被创建时,当应用程序关闭时清除这个临时文件。因此,在应用程序的第二转载 2022-12-07 15:54:08 · 387 阅读 · 0 评论 -
QT单元测试初探
QT单元测试_疯狂的挖掘机的博客-优快云博客_qt 单元测试文献还是官方的权威,找到目前用的QT5.15的对应的文档:QT5的官方文档:https://doc.qt.io/qt-5/qttest-index.htmlhttps://doc.qt.io/qt-5/qtest-tutorial.html这个入门的小例子,不是用ide调用的。要用QTCreator运行,点击“tools-》tests-》Run All Tests”执行全部的测试。原创 2022-11-29 20:20:55 · 523 阅读 · 0 评论 -
QT的C++命名空间的使用
现在就很清楚了,这两个看起来名字一样的 Widget 其实是两个类,一个是 namespace Ui 里的,另一个是 namespace Ui 之外的 Widget 类,namespace 声明的类其实就是个空壳,它的基类功能是将此窗口上的所有控件的声明、实例化、初始化。声明的原因就是为了使 ui 布局控制和其他的控制代码分离。/* 使用 namespace 声明 */ namespace UI { class Test: public Base {};看来QT的C++工程也是这么用的。原创 2022-11-29 12:17:04 · 724 阅读 · 0 评论 -
linux环境QT做静态库,QT静态库的创建与使用
最近研究一下静态库的开发;最初学习的资料是:QT静态库的创建与使用(全网最细)_路漫漫其远,吾求索的博客-优快云博客_qt生成静态库建立一个静态库成功。如果同时打开静态库和运行程序调用,调式模式下,可以进入静态库的内部函数进行调试;原创 2022-11-29 12:04:46 · 2006 阅读 · 0 评论 -
Qt中工程配置中的DEPENDPATH 和 INCLUDEPATH 的区别
根据makefile规则,紧跟在main.o: 后面的文件是编译生成main.o文件时依赖的文件,这个依赖的意思是,如果依赖的文件在main.o文件发生过更改,那么下次编译时main.o需要重新生成,否则无需重新生成增加DEPENDPTH后,Qt会将该目录下所有的头文件加入到每个cpp文件对应的.o文件的依赖文件里,这样如果DEPENDPATH目录里的头文件发生了变化,所有的cpp都会重新编译。在Qt中添加库文件的时候,Qt会自动在pro文件里生成三行配置。没有DEPENDPATH设置。转载 2022-11-29 10:47:22 · 1353 阅读 · 0 评论 -
翻译QT使用手册:将库添加到项目
除了 Qt 库之外,您还可以将其他库添加到您的项目中。您可以添加系统库、您自己的库或第三方库。除了 Qt 库之外,您还可以将其他库添加到您的项目中。您可以添加系统库、您自己的库或第三方库。对于您自己的库和第三方库,您需要指定路径。Windows 上的默认约定是库的调试版本和发布版本具有相同的名称,但放在不同的子目录中,通常称为。一旦您的项目成功构建并链接到它们,Qt Creator 就支持添加库的代码完成和语法突出显示。因为系统库通常不会更改并且通常默认找到,所以在添加库时不需要指定库路径或包含库的路径。原创 2022-11-29 10:40:43 · 1363 阅读 · 0 评论 -
QT工程配置.pro文件中LIBS 与 PRE_TARGETDEPS的区别
LIBS:形式:目的:指定要链接到项目中的库列表。如果您使用 Unix -l(库)和 -L(库路径)标志,qmake 在 Windows 上正确处理库(即,将库的完整路径传递给链接器)。该库必须存在,qmake 才能找到 -l lib 所在的目录。形式:目的:列出目标所依赖的库。某些后端(例如 Visual Studio 和 Xcode 项目文件的生成器)不支持此变量。通常,这些构建工具在内部支持此变量,它对于显式列出依赖的静态库很有用。参考主要区别。转载 2022-11-29 10:26:30 · 998 阅读 · 0 评论 -
linux环境下QT程序内存泄露检测-Qt creator +Valgrind检测内存泄漏(linux)
要是用See 'snap info valgrind' for additional versions.可以获得更高的版本。是相互独立的,所以需要安装valgrind后,Qt creator才能使用该功能进行内存检测分析。不想折腾了,就用3.15的吧。由于Qt creator和。原创 2022-11-28 17:07:39 · 1565 阅读 · 0 评论 -
Linux下 Qt程序异常结束调试
Linux下 Qt程序异常结束调试,异常调试。转载 2022-11-28 16:54:04 · 1081 阅读 · 0 评论 -
QT应用编程: window下QT程序异常捕获并生成DMP文件、PDB文件
win10 64位QT5.12.6。转载 2022-11-28 16:40:04 · 1833 阅读 · 0 评论 -
QT的进程间通讯的技术点:QTDBUS总结
转载请注明出处。转载 2022-11-25 16:55:50 · 775 阅读 · 0 评论 -
qRegisterMetaType用法总结
如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册,当然在不跨线程时使用自定义类型signal/slot来传递,可能不会出现什么问题;一旦涉及跨线程就很容易出错,回想下信号槽的作用就是用来对象与对象之间通信的,难免会跨线程,建议在使用自定义类型利用信号槽通信时,最好先通过qRegisterMetaType()将自定义类型进行注册,以免出错。转载 2022-11-23 15:07:26 · 10458 阅读 · 0 评论 -
QT笔记——QT类反射机制简单学习
4.Q_OBJECT 宏展开之后有一个虚拟成员函数 meteObject(),该函数会返回一个指向QMetaObject 类型的指针,通过该函数返回的指针调用 QMetaObject 类中的成员函数,便可查询到 QObject 及其派生类对象的各种信息。使用QMetaObject对象调用;2.moc编译器是一个类似于qmake的工具,用于读取分析C++文件,若发现类包含Q_OBJECT宏的声明,会生成另外一分包含Q_OBJECT宏实现的C++源文件,被编译器一起编译。转载 2022-11-18 21:58:19 · 515 阅读 · 0 评论 -
qt 内省与反射的例子
这个例子很典型,记录到这里,转载请注明来自:http://blog.youkuaiyun.com/ndzjx/article/details/77312559。转载 2022-11-18 21:52:01 · 209 阅读 · 0 评论 -
Qt反射机制一
虚拟成员函数,通过该函数返回的指针调用QMetaObject 类中的成员函数,便可查询。统的核心类,通过该类的成员函数可以获取QObject 及其派生类对象的所有元信息,①、Qt 使用了一系列的类来实现反射机制,这些类对对象的各个方面进行了描述,其中。//输出该成员函数的名称。②、对对象的成员进行描述:一个对象包含数据成员、函数成员、构造函数、枚举成员等。成员,在Qt 中,这些成员分别使用了不同的类对其进行描述,比如函数成员使用类。②、注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入。转载 2022-11-15 12:32:49 · 507 阅读 · 0 评论 -
QT QElapsedTimer QDeadlineTimer 计算已用时间的方法
QElapsedTimer timer; timer.start(); slowOperation1(); qDebug()原创 2022-10-28 14:56:46 · 475 阅读 · 0 评论