当前位置 : 主页 > 网络编程 > PHP >

qt编程中的一些技巧

来源:互联网 收集:自由互联 发布时间:2023-10-08
是否继承QObject qt的对象系统中,有一个父对象的概念(不是指父类子类),创建一个类(必须继承自QObject),这个类就可以用setParent(xx)等函数(或者说实例化该对象的时候把QObject(p


是否继承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的事件啦,对于子窗口想处理父窗口的事件的时候,这个就可以
上一篇:php截取字符串中的一部分
下一篇:没有了
网友评论