- 博客(111)
- 资源 (2)
- 收藏
- 关注
原创 Qt安卓开发(四)摄像头拍照保存
本文介绍了在Qt6.10中使用QML实现摄像头拍照并保存到系统相册的方法。关键点包括:1) 使用ImageCapture对象捕获图片,调用captureToFile方法保存;2) 通过Android API获取公共图片目录路径,确保图片能被系统相册识别;3) 利用时间戳生成唯一文件名。文章还对比了临时目录和公共目录的保存效果,指出高版本Qt已自动处理了大部分权限问题。虽然QML的图片保存机制略显复杂,但文件路径处理是通用的,后续可通过QImage进行更多图片操作。
2026-02-09 15:13:44
448
原创 Qt安卓开发(三)双摄像头内嵌布局
摘要 本文介绍了一个实现手机双摄像头同时录制功能的QML代码示例。通过Qt框架的Camera和VideoOutput组件,实现了前后摄像头画面同屏显示的效果,其中主画面显示后置摄像头,右上角小窗口显示前置摄像头。代码包含摄像头权限处理、双摄像头初始化、画面切换逻辑等功能,并提供了启动/停止摄像头、交换主副画面等操作按钮。该实现解决了部分手机系统删除此功能的问题,为开发者提供了自定义双摄录制的技术参考。
2026-01-14 19:23:10
443
原创 Qt安卓开发(二)摄像头打开
摘要 本文介绍了在Qt6.10环境下实现安卓摄像头功能的关键步骤。首先优化了工程结构,采用qmake构建并分离功能模块。重点讲解了QML中摄像头实现的核心组件:CaptureSession管理采集、Camera控制摄像头、VideoOutput显示画面。针对安卓环境特有的权限问题,文章指出需要动态申请相机权限,这是Windows与安卓环境的重要差异。虽然未展示具体权限申请代码,但明确了下一步将解决权限动态申请这一关键问题,确保摄像头功能在安卓设备上正常运行。
2026-01-13 19:24:08
754
1
原创 Qt多进程(十一)Linux下socket通信
本文介绍了在Linux环境下使用纯C语言实现TCP socket通信的方法。通过代码示例展示了服务端和客户端的实现过程,包括创建套接字、绑定地址、监听连接、数据读写等关键步骤。文章重点分析了socket参数选择对通信协议的影响,指出了TCP/UDP/UDS的实现差异,并讨论了阻塞问题及其解决方案。最后简要提及了使用epoll机制处理阻塞问题的方法,为纯C环境下的网络编程提供了实用参考。
2026-01-11 20:28:11
726
原创 Qt多进程(十)匿名管道Pipe
本文介绍了Linux中匿名管道的基本原理和使用方法。匿名管道是父子进程间通信的一种方式,通过文件描述符实现单向数据传输。文章通过代码示例展示了如何创建管道、使用fork()启动子进程,以及父子进程如何通过关闭不需要的端口来实现单向通信。关键点包括:管道创建返回读写两个文件描述符、fork()复制进程的特性、读写操作的阻塞性质,以及避免僵尸进程的wait()调用。最后对比了匿名管道与命名管道的主要区别,突出了匿名管道仅限父子进程通信的特点。示例代码清晰地演示了父子进程通过管道传递消息的完整流程。
2026-01-11 18:28:43
302
原创 Qt多进程(九)命名管道FIFO
本文介绍了Linux环境下命名管道(FIFO)的进程间通信方式。FIFO是一种特殊文件,存在于内核缓冲区,具有先进先出特性,支持单向通信和多进程协作。文章通过终端命令和C代码示例演示了FIFO的创建、读写操作,并分析了其特点:性能优于普通文件但可靠性较低。FIFO适用于简单进程通信、日志收集等场景,自带同步机制,是高效本地IPC的选择。
2026-01-10 17:31:40
871
原创 Qt安卓开发(一)Qt6.10环境配置
本文记录了Qt6.10环境下配置Android开发环境的过程。首先通过Qt维护工具安装Android模块,然后配置JDK17和Android SDK组件,解决了OpenSSL下载失败的问题。在连接真实安卓设备时,作者发现虚拟设备运行困难,转而通过USB连接小米手机成功部署。文中分享了简单的QML计数器程序实现,并指出后续开发中可能遇到的摄像头权限申请、文件存储等安卓特有问题的挑战。整个配置过程比预期简单,为后续开发纯界面应用奠定了基础。
2026-01-09 14:53:37
818
原创 Qt多进程(八)消息队列(基于文件)
本文介绍了基于文件实现的消息队列原理及Qt实现方案。消息队列采用生产者-消费者模型,通过本地文本文件模拟队列行为:生产者将消息逐行写入文件末尾,消费者从文件开头读取并删除已处理消息。文章提供了一个Qt窗口类实现,包含消息入队(onSendMessage)和出队(onReadMessage)功能,其中服务器端还实现了定时检查队列的机制。该方案展示了IPC通信的一种简单实现方式,通过文件读写操作模拟队列的FIFO特性,适用于跨线程/进程的数据传递场景。代码示例完整展示了文件队列的创建、读写和更新流程。
2026-01-04 00:29:26
713
原创 Qt多进程(七)内存映射
本文介绍了基于文件的内存映射(Memory-Mapped File)这一跨平台进程间通信(IPC)方式。相比原生共享内存,它具有更好的健壮性和兼容性。核心原理是将磁盘文件映射到进程虚拟地址空间,通过内存操作实现数据共享。Qt提供了QFile::map()等接口支持该功能,包括打开文件、映射内存区域、解除映射等操作。文中给出了完整实现示例,展示了如何通过内存映射文件进行进程间通信,包括写入数据时添加协议头标记,以及读取时验证数据有效性等关键步骤。该方案适合需要跨平台、稳定可靠的IPC场景。
2026-01-03 23:13:32
679
原创 Qt多进程(六)共享内存和信号量
本文介绍了基于共享内存和信号量的进程间通信实现方法。共享内存作为高效的IPC机制,允许多个进程直接访问同一物理内存区域,实现数据零拷贝传输,特别适合大块数据传输。文章分析了共享内存的优点(高性能、跨语言兼容)和缺点(需手动同步、调试困难),并提供了Qt框架下的实现方案,包括QSharedMemory和QSystemSemaphore的使用方法。通过生产者-消费者模型示例代码,展示了如何使用两个信号量实现进程间同步,同时指出了实际应用中可能存在的问题和注意事项。
2025-12-31 22:37:20
925
原创 Qt多进程(五)QUdpSocket
本文介绍了在Qt开发中使用QUdpSocket实现进程间通信(IPC)的方法。UDP协议具有无连接、低延迟的特点,适合轻量级IPC场景。文章详细对比了UDP与TCP的优缺点,指出UDP在广播、实时数据等场景的优势,同时也说明其不可靠性等局限。通过代码示例展示了Qt中QUdpSocket的基本用法,包括单播、广播和组播的实现方式,并提供了一个完整的UDP通信窗口类实现。该方案支持本地回环通信(127.0.0.1),无需建立连接即可实现进程间数据交换,特别适合“发即忘”类型的应用场景。
2025-12-26 16:18:04
725
原创 Qt多进程(四)QTcpSocket
本文介绍了使用TCP协议实现进程间通信(IPC)的方法。TCP作为传输层协议,虽然主要用于网络通信,但通过本地回环地址(127.0.0.1)也可实现本地进程间通信。文章分析了TCP用于IPC的优缺点:优点是跨平台、开发简单、支持多连接;缺点是性能开销大、延迟较高。Qt提供了QTcpServer和QTcpSocket类来简化TCP通信开发,支持异步和同步两种模式。文中还提到TCP通信中的粘包问题及解决方案,并给出了一个使用Qt实现的TCP通信示例代码框架,包括服务端和客户端的初始化、连接建立、消息收发等功能。
2025-12-25 22:30:57
985
原创 Qt多进程(三)QLocalSocket
本文介绍了Qt中的LocalSocket进程间通信方式,它基于CS架构实现本地全双工通信。相比TCP,LocalSocket不走网络协议栈,在Windows下使用命名管道,Unix下使用Unix Domain Socket,具有更高效率。文章通过代码示例展示了QLocalServer和QLocalSocket的使用方法,包括服务端监听、客户端连接、消息收发等核心功能。LocalSocket适合本机进程通信,避免了TCP的网络开销,是本地IPC的高效解决方案。
2025-12-22 12:38:53
815
原创 Qt多进程(二)QProcess+stdio
本文介绍了使用QProcess实现Qt进程间通信的方法。主要内容包括:1)通过QProcess启动子进程的两种方式(同步/异步);2)利用main函数参数传递实现进程模式切换;3)基于标准输入输出(stdio)的通信机制;4)提供完整代码示例,展示如何通过信号槽机制实现异步通信。该方法简单实用,适用于需要快速实现进程调用的场景。
2025-12-21 01:54:40
758
原创 Qt多进程(一)进程间通信概括
本文介绍了基于Qt6.10的多进程通信(IPC)测试工程搭建过程。作者通过下拉选择框整合了TCP Socket、Local Socket、Shared Memory等多种IPC方式,采用工厂模式动态创建对应的测试界面类。该设计支持双开同一exe进行服务端和客户端测试,具有良好的扩展性和维护性。后续将针对每种IPC方式进行详细测试和记录,以全面掌握多进程通信技术。
2025-12-20 16:26:01
470
原创 Qt线程使用(六)QThreadPool + QRunnable
本文介绍了Qt中使用QThreadPool和QRunnable实现线程池的方法。通过示例代码展示了如何创建继承QRunnable的任务类,并提交到线程池执行。文章详细说明了线程池的自动管理特性、最大线程数控制以及任务通信的两种方案(多重继承或回调机制)。最后对比了Qt中四种线程使用方式的适用场景,建议根据任务类型选择合适方案,强调后台线程禁止直接访问GUI对象,必须通过安全方式与主线程通信。
2025-12-07 16:05:32
883
原创 Qt线程使用(五)QtConcurrent模块
本文介绍了Qt框架中两种并发编程方式:传统QThread与QtConcurrent模块的对比。重点讲解了QtConcurrent::run()和QtConcurrent::mapped()两种实现方式。run()适用于简单异步任务,mapped()适合批量并行处理。文章通过具体代码示例演示了两种方法的使用场景和优势,包括避免界面阻塞、自动线程管理等特性。相比于传统QThread方式,QtConcurrent提供了更高层次的抽象,简化了并发编程复杂度,特别适合短期任务和批量处理场景。
2025-12-07 15:20:06
1172
原创 Qt线程使用(四)信号槽中的传递参数机制
在信号槽的使用中,还有一个问题需要特别注意,那就是我们传递的参数类型。会不会自动拷贝、能否使用指针或引用、智能指针是否支持、自定义结构体需要如何注册,这些都是需要考虑的问题。
2025-12-03 16:17:36
1083
原创 Qt线程使用(三)跨线程信号槽及第五位参数
本文介绍了Qt中跨线程数据传递的信号槽机制实现方法。首先展示了基本的信号槽跨线程通信示例,通过WorkerClass发送时间信号到WorkerManager接收。然后重点分析了信号槽connect函数的第五个参数ConnectionType的不同模式:AutoConnection、DirectConnection和QueuedConnection,详细解释了它们的适用场景。特别探讨了跨线程使用DirectConnection的同步通信场景,及同一线程中使用QueuedConnection实现异步处理的案例。
2025-12-02 12:26:42
728
原创 Qt线程使用(二)moveToThread
本文介绍了Qt中moveToThread实现多线程的方法,这是Qt官方推荐的线程使用方式。通过将业务类WorkerClass继承QObject并移动到子线程中执行,同时利用信号槽机制实现线程启动、任务执行和安全退出。关键点包括:1) 业务类与线程解耦;2) 通过信号槽触发线程任务和资源清理;3) 使用finished信号确保线程安全退出。相比直接继承QThread,这种方式更符合Qt的事件驱动模型,能更好地管理线程生命周期和资源释放。
2025-12-01 17:11:37
1220
原创 Qt线程使用(一)直接继承QThread类
本文介绍了在Qt中使用线程的四种方案,重点讲解了直接继承QThread的实现方式。通过WorkerThread类示例展示了如何重载run()函数执行线程任务,使用原子变量控制线程启停,并正确处理资源析构。文章指出直接继承QThread虽然简单,但存在业务代码与线程实现高度耦合的问题,不利于代码复用。后续将介绍更优的moveToThread等方法来实现业务与线程的分离。该方案适合基础场景,但面对复杂需求时需要更灵活的设计模式。
2025-11-30 23:34:56
1000
原创 Qt调试之Dump文件调试
本文介绍了在Qt开发中使用Dump文件进行调试的方法。通过链接Windows SDK中的dbghelp.lib库,可以在程序崩溃时自动生成Dump文件。文章详细说明了在CMake和qmake项目中的配置方法,并提供了一个MiniDumper类实现自动捕获崩溃并生成Dump文件的功能。该方法适用于MSVC编译环境,能够帮助开发者事后分析程序崩溃原因,是除GDB调试外的另一种有效调试手段。
2025-11-27 16:51:05
653
原创 QML学习笔记(五十六)Model-View:ListView的页眉、页脚、高亮和分组
本文介绍了如何在Qt Quick的ListView中实现页眉页脚和高亮效果。页眉页脚通过header和footer属性添加自定义组件实现,可以独立于数据模型显示固定内容。高亮效果则通过highlight属性定义选中项样式,需配合currentIndex属性控制选中状态,并通过z轴排序和透明度设置实现视觉叠加。文章还详细说明了SpringAnimation动画参数的作用,帮助开发者调整高亮切换时的弹性效果。这些功能丰富了ListView的交互体验和视觉效果,为数据展示提供了更多设计可能性。
2025-11-19 00:48:11
622
原创 QML学习笔记(五十五)Model-View:ListView和ListModel
本文介绍了QML中ListView和ListModel的使用方法。ListView用于展示列表数据,需要绑定一个模型(ListModel)和一个委托(delegate)。ListModel包含多个ListElement,每个元素存储键值对数据。委托(如Rectangle组件)决定了单个数据的显示方式,并能自动关联模型数据。文章通过代码示例展示了基本实现,并演示了两种定义委托的方式:使用Component或直接在ListView中定义。最后还展示了如何为列表项添加鼠标点击功能。
2025-11-12 02:20:41
711
原创 QML学习笔记(五十五)Model-View:初步了解
本文简要介绍了Qt中的Model-View机制及其在QML中的应用。Model负责封装数据,View负责显示数据(如ListView、GridView等),Delegate则处理单个数据单元的呈现方式。这种设计模式实现了数据与展示的分离,提高了代码的复用性和灵活性。作者计划在QT6环境中通过实际项目示例深入掌握这一机制,重点关注ListView和TableView等组件的使用。文章强调Model-View是通用的设计模式而非QML独有,为后续学习奠定了基础。
2025-11-12 01:29:15
963
原创 QML学习笔记(五十四)QML与C++交互:数据转换——QVariantList与QVariantMap
本文介绍了Qt框架中QVariantList与QVariantMap在C++与QML之间的数据转换。通过CppClass1类展示了如何在C++端处理QVariantList和QVariantMap数据,包括从QML接收数据、向QML发送混合类型数据,以及C++直接调用QML函数等功能。核心要点包括:1)使用QVariant存储多种数据类型;2)通过Q_INVOKABLE标记C++方法供QML调用;3)利用QMetaObject::invokeMethod实现C++调用QML函数。示例代码清晰展示了双向数据传
2025-11-08 21:29:52
994
原创 QML学习笔记(五十三)QML与C++交互:数据转换——序列类型与 JavaScript 数组的转换
本文展示了C++与QML之间数组/序列类型的自动转换方法。通过QVetor<QString>和JavaScript数组的互操作示例,演示了如何:1) 将QML数组传递给C++处理;2) 从C++获取字符串数组到QML中使用。实际代码证明Qt框架能自动完成这种类型转换,无需额外处理。这种数据交互方式在前端展示(C++→QML)和后端数据管理(QML→C++)的场景中非常实用。
2025-11-06 17:02:54
301
1
原创 QML学习笔记(五十二)QML与C++交互:数据转换——时间和日期
本文介绍了QML与C++交互中时间和日期数据的传递方法。在C++端使用QDateTime和QTime类,QML端使用Date类,两者可互相转换调用。通过信号槽机制实现数据传递,并展示了QML中日期时间的处理方法。同时演示了字符串参数替换功能,类似C++的QString.arg()方法。最后指出时间传递时需注意数据类型差异可能导致的显示问题。这些方法在开发中具有实用价值。
2025-11-06 15:13:37
326
原创 QML学习笔记(五十一)QML与C++交互:数据转换——基本数据类型
摘要:本文介绍了QML与C++交互时的数据类型转换问题。通过定义C++类CppClass并注册为可实例化QML组件,演示了不同类型数据在两者间的传递方式。文章展示了基本类型(int、double、bool)、字符串、颜色、字体等数据的传输示例,以及如何在QML中处理接收到的C++数据。重点说明了数据类型转换的注意事项,帮助开发者避免跨语言交互时的类型错误。
2025-11-05 17:18:24
266
原创 QML学习笔记(五十)QML与C++交互:QML中单例C++对象
本文介绍了在QML中使用C++单例模式的方法。通过qmlRegisterSingletonType函数注册单例类,实现在QML中直接调用C++单例对象的功能。文章详细展示了单例类的实现代码、注册过程以及QML调用方式,并对比了Qt5和Qt6版本的不同处理方案。同时指出在Qt6中可以使用QML_SINGLETON和QML_ELEMENT宏简化注册流程,为QML与C++混合开发提供了实用的技术方案。
2025-11-01 17:01:27
419
原创 QML学习笔记(四十九)QML与C++交互:QML中可实例化C++对象
摘要: 本文介绍了在QML中直接实例化C++对象的方法。通过qmlRegisterType函数注册C++类(如Movie类)到QML引擎,可以在QML中创建和管理该对象实例。相比传统方式(C++端创建实例后暴露给QML),这种方法更适合与QML强相关的业务对象,由QML控制其生命周期。文中详细演示了从C++类定义、属性注册到QML端创建和使用的完整流程,并对比了两种方式的适用场景:上下文属性适合全局单例,而QML实例化适合有状态的小部件和临时对象。最后说明Qt内置类型(如Camera)也是通过相同机制实现的
2025-10-31 14:52:49
692
原创 QML学习笔记(四十八)QML与C++交互:上下文对象
本文介绍了Qt中上下文对象(QQmlContext::setContextObject)的使用方法。通过示例代码展示了如何将一个C++类对象整体暴露给QML端,使其属性(Q_PROPERTY)可以直接在QML中被引用。相比上下文属性暴露方式,上下文对象的优点是代码简洁,但存在命名冲突风险且不能暴露多个同类对象。作者认为上下文属性暴露方式更加清晰可靠,推荐优先使用。文章还提到对于单例模式工具类,可以采用qmlRegisterSingletonInstance注册方式,这将在后续学习中探讨。
2025-10-30 14:53:42
494
原创 QML学习笔记(四十七)QML与C++交互:Q_PROPERTY宏映射
本文介绍了如何在Qt框架中使用Q_PROPERTY宏将C++类的成员变量映射为QML属性。通过Q_PROPERTY声明,可以定义属性的读写方法和变更信号,使QML端能够像使用普通属性一样访问和绑定这些变量。文章以Counter和Movie类为例,展示了如何实现属性绑定,并强调在修改成员变量时需通过setter方法触发变更信号,确保QML端能正确响应变化。最后通过一个完整的Movie类实例,演示了QML中如何监听和修改这些属性,实现C++与QML的双向数据绑定。
2025-10-22 20:45:11
648
原创 QML学习笔记(四十六)QML与C++交互:信号槽的双向实现
本文介绍了如何在QML和C++之间通过信号槽机制实现双向通信。在C++端创建信号发送类并暴露给QML上下文后,QML可以直接调用C++槽函数或通过Connections接收C++信号;反之,C++端也能连接QML组件发出的信号。这种机制降低了界面和业务逻辑的耦合性,只需获取对方对象即可建立通信,无需关心具体实现细节。通过定时器示例和按钮交互演示了两种方向的信号传递,展示了Qt框架在混合编程中的便利性。
2025-10-21 17:29:08
540
原创 QML学习笔记(四十五)QML与C++交互:对QML对象设置objectName
本文介绍了C++端如何通过QML组件的objectName属性实现双向交互。首先在QML中为组件设置objectName属性,然后在C++端通过findChild方法查找对应的QObject对象。找到对象后,可以使用property接口读取或修改组件属性值,还能通过invokeMethod调用QML组件中声明的函数或信号。这种方法打通了C++与QML之间的双向通信渠道,使C++端具备主动获取和操作QML组件的能力。
2025-10-21 16:30:50
326
原创 QML学习笔记(四十四)QML与C++交互:上下文属性暴露
本文介绍了QML与C++交互的方法,重点讲解了通过setContextProperty将C++对象暴露给QML的机制。在C++端,通过QQuickWidget加载QML界面,并将登录类实例通过上下文属性"loginHandler"暴露给QML。QML端可以直接调用C++对象的公共方法(需加Q_INVOKABLE宏)和槽函数,实现了从QML到C++的单向调用。文中通过一个登录窗口案例演示了用户名和密码从QML传递到C++端处理的完整流程,并展示了返回值传递的功能。该方法实现了UI层与业务逻
2025-10-18 16:28:02
864
原创 QML学习笔记(四十三)QML的MessageDialog
本文介绍了QML中的MessageDialog组件及其使用方法。作为Qt6中的消息弹窗组件,MessageDialog可提供简单提示或选择功能,支持多种模式选择。文章通过代码示例展示了如何创建询问和警告对话框,并详细说明了按钮配置、信号处理等特性。同时对比了QML MessageDialog与QWidget QMessageBox的差异,包括模块依赖、外观表现、按钮文字、图标类型等方面的区别。最后指出,虽然默认组件能满足基本需求,但如需高度自定义样式,建议自行实现弹窗组件以获得更好的灵活性。
2025-10-17 21:09:21
493
原创 QML学习笔记(四十二)QML的ColorDialog和FontDialog
本文介绍了QtQuick中颜色选择框和字体选择框的简单使用方法。通过代码示例演示了如何创建颜色矩形和文本标签,并分别绑定ColorDialog和FontDialog来实现交互式修改。这两种对话框虽然样式受限于系统原生风格,但使用方便且跨平台兼容。文章指出在实际开发中通常直接采用系统弹窗,并提醒需要注意界面翻译问题,建议使用qm翻译文件来处理对话框中的英文文本。整体展示了QtQuick中常用对话框的快速实现方式。
2025-10-17 16:12:30
339
原创 QML学习笔记(四十一)QML的FileDialog和FolderDialog
本文介绍了如何在QtQuick中使用文件选择弹窗和目录选择弹窗。由于不同Qt版本模块支持差异,作者通过别名方式分别引用了QtQuick.Dialogs和Qt.labs.platform模块。文章提供了完整的代码示例,展示如何创建两个按钮分别触发文件和目录选择对话框,并将用户选择结果显示在文本框中。虽然这些原生弹窗样式较为简单,但掌握其使用方法对提升界面交互性很有必要。
2025-10-17 15:52:32
368
原创 QML学习笔记(四十)QML的ApplicationWindow和StackView
本文介绍了QtQuick.Controls 2中的两个核心组件:ApplicationWindow和StackView。ApplicationWindow是一个自带标题栏、菜单栏等UI元素的顶层窗口,适合快速开发导航功能。StackView则是QML的页面导航栈,支持push/pop操作、动画切换和生命周期管理,相当于QWidget中QStackedWidget的增强版。文章还提供了两者的功能对比表,并通过一个测试例子展示了如何在实际项目中结合使用这两个组件,实现带有菜单栏、工具栏和多页面切换的应用程序界面
2025-10-16 22:02:33
969
QT按钮点击切换QLineEdit焦点
2022-06-07
QT模拟鼠标事件,实现点击双击移动拖拽等
2022-05-31
请问有办法调用dll中的类吗(标签-QT|关键词-get)
2023-10-09
qt中执行阻塞耗时步骤前修改ui无法立即响应,如何解决?
2023-01-03
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅