是否继承QObject
qt的对象系统中,有一个父对象的概念(不是指父类子类),创建一个类(必须继承自QObject),这个类就可以用setParent(xx)等函数(或者说实例化该对象的时候把QObject(parent)这样也是同样的道理),也就是给这个对象设置要给父对象了。
指定父对象的用途:父对象析构delete删除时,会把所有的子对象一起删除了,这样子对象的删除操作不用我们手动去delete了。如果没有指定该对象的父对象,那么我们得自己在创建这个对象的地方,注意看它哪里不需要了,自己手动delete它,但是这个往往很难把握,因此会造成内存泄漏。
比如mainwindow类中包含了很多成员对象(都是通过new方式搞出来的),但是他们都设置了mainwindow作为他们的父对象,那么mainwindow的析构函数中,就不需要delete这些对象了,因为mainwindow被释放的时候,会自动delete掉这些子对象,这就是最大的好处。否则需要我们再mainwindow的析构函数中逐个delete它们。
是否子类化(继承该类做一个新类)一个类
1. 我们是否要实现多态,如果是,那就要子类化
2. 如果我们必须要重写这个类的虚函数,那么也一定要子类化这个类
其它的用途,倒不需要了,直接创建这个类的对象拿来用即可。否则,逻辑搞复杂了,虽然结果都是能实现功能,但是没必要了,毕竟代码还是讲究好理解性。
槽函数在哪儿执行
如果信号发射位置是次线程(此线程的run函数里),那么槽函数执行就要特别注意是不是主线程了,参考博客:
关于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);
需不需要创建一个线程再里面去启动一个进程
取决于启动这个进程是否是耗时操作,就普通的启动,那就不是,如果启动完后,需要一直轮询和监控这个进程(而不是信号和槽方式)那这个线程就很有必要了,不然卡顿主界面。或者启动完后,需要等待它启动成功(其实这个可以用那个启动成功的信号来触发,所以也不需要线程也行的),然后要马上给它写大量数据,此时也是需要这个线程了。
成员函数成员变量的的定义
尽量简洁,用不到的,冗余的,没必要的,啰嗦的,统统不需要,能直接解决,就不要额外定义函数和变量了。不然代码逻辑混乱,难看,不清晰
- xx->installEventFilter(xxchild); //这样xxchild这个类中就能处理父窗口xx的事件啦,对于子窗口想处理父窗口的事件的时候,这个就可以