当前位置: 首页 > news >正文

qt编程中的一些技巧

是否继承QObject

qt的对象系统中,有一个父对象的概念(不是指父类子类),创建一个类(必须继承自QObject),这个类就可以用setParent(xx)等函数(或者说实例化该对象的时候把QObject(parent)这样也是同样的道理),也就是给这个对象设置要给父对象了。

可以参考:Qt对象间的父子关系_只爱编程的菜鸟的博客-CSDN博客_qt 父子关系

指定父对象的用途:父对象析构delete删除时,会把所有的子对象一起删除了,这样子对象的删除操作不用我们手动去delete了。如果没有指定该对象的父对象,那么我们得自己在创建这个对象的地方,注意看它哪里不需要了,自己手动delete它,但是这个往往很难把握,因此会造成内存泄漏。

比如mainwindow类中包含了很多成员对象(都是通过new方式搞出来的),但是他们都设置了mainwindow作为他们的父对象,那么mainwindow的析构函数中,就不需要delete这些对象了,因为mainwindow被释放的时候,会自动delete掉这些子对象,这就是最大的好处。否则需要我们再mainwindow的析构函数中逐个delete它们。

是否子类化(继承该类做一个新类)一个类

1. 我们是否要实现多态,如果是,那就要子类化

2. 如果我们必须要重写这个类的虚函数,那么也一定要子类化这个类

其它的用途,倒不需要了,直接创建这个类的对象拿来用即可。否则,逻辑搞复杂了,虽然结果都是能实现功能,但是没必要了,毕竟代码还是讲究好理解性。

槽函数在哪儿执行

如果信号发射位置是次线程(此线程的run函数里),那么槽函数执行就要特别注意是不是主线程了,参考博客:Qt多线程中槽函数在哪个线程里执行分析_艾米莉亚糖的博客-CSDN博客_qt槽函数在哪个线程执行

关于QT中线程类中的槽函数在主线程中执行的问题 - 知乎

其实还有个解决办法,我们在槽函数中,再调用qt这个  QtConcurrent::run 这个静态方法,实现另一个线程中调用就行。

信号和槽的关联方式

    //信号和槽的关联,qt4使用 connect(quitButton, SIGNAL(clicked(参数类型列表写上)), &app, SLOT(quit(参数类型列表写上)));
    //qt5,就是下面这种,参数类型列表不写了。建议用qt5这种,因为编译时能检查参数匹配情况
    process.connect(&process, QOverload<int, ExitStatus>::of(&QProcess::finished), this,&UpdateSymbols::onFinished);

需不需要创建一个线程再里面去启动一个进程

取决于启动这个进程是否是耗时操作,就普通的启动,那就不是,如果启动完后,需要一直轮询和监控这个进程(而不是信号和槽方式)那这个线程就很有必要了,不然卡顿主界面。或者启动完后,需要等待它启动成功(其实这个可以用那个启动成功的信号来触发,所以也不需要线程也行的),然后要马上给它写大量数据,此时也是需要这个线程了。

成员函数成员变量的的定义

尽量简洁,用不到的,冗余的,没必要的,啰嗦的,统统不需要,能直接解决,就不要额外定义函数和变量了。不然代码逻辑混乱,难看,不清晰

相关文章:

  • 刷题记录:NC146615简单的数据结构
  • 2022.10月11月todo
  • Pytorch混合精度训练
  • 不会代码(实操能力弱一点)的我如何快速开发出一个Android/Web/IOS/小程序
  • 【博客503】kubelet device plugin如何管理与分配device
  • 第4章-4 验证“哥德巴赫猜想”
  • 嗨购商业模式赋能消费者、创业者和实体商家,助力中小微企业
  • 1469_TC275串口字符串输出例程中的中断功能分析
  • 360面试——计算机视觉面试
  • CentOS6.9更换yum源镜像网站方法大汇总
  • React组件间传值
  • SQL入门(三)数据库之表连接(内联外联的区别)
  • BUUCTF-社团考核
  • 基于卷积神经网络故障诊断模型的 t-SNE特征可视化
  • 不写DAX实现TopN和其他
  • 【EOS】Cleos基础
  • conda常用的命令
  • Create React App 使用
  • CSS 专业技巧
  • gulp 教程
  • JS 面试题总结
  • Laravel Telescope:优雅的应用调试工具
  • Lsb图片隐写
  • Vim Clutch | 面向脚踏板编程……
  • 当SetTimeout遇到了字符串
  • 前端之React实战:创建跨平台的项目架构
  • 赢得Docker挑战最佳实践
  • 用element的upload组件实现多图片上传和压缩
  • 优化 Vue 项目编译文件大小
  • 怎样选择前端框架
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​渐进式Web应用PWA的未来
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (算法设计与分析)第一章算法概述-习题
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)ABI是什么
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .htaccess配置常用技巧
  • .net core使用ef 6
  • .net 按比例显示图片的缩略图
  • .NET 表达式计算:Expression Evaluator
  • .NET微信公众号开发-2.0创建自定义菜单
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • :O)修改linux硬件时间
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @GlobalLock注解作用与原理解析
  • @property括号内属性讲解
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [Android] Upload package to device fails #2720
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [c++] C++多态(虚函数和虚继承)
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [Django ]Django 的数据库操作