如果使用QApplication,qApp-> exec()是否有效

时间:2015-10-24 21:23:58

标签: c++ qt qapplication qcoreapplication

如果我使用qApp->exec()实例,是否有效拨打QCoreApplication::exec()QApplication?由于它是一个静态函数,因此在两种情况下都会调用QCoreApplication::exec()。然而,似乎即使我打电话给其中一个,我的基于QApplication的程序运行得很好 - 这只是运气/巧合还是有效?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

简短回答:

这不是运气,因为静态函数的行为也应该像普通的非虚函数一样。

答案很长:

静态函数是不使用 this 指针的成员函数。当你从一个对象中调用它时,它的行为就像一个普通的成员。

由于QAppliction派生自QCoreApplication,而exec()是QCoreApplication的成员,因此它也是从QCoreApplication派生的类型对象的成员。

qApp返回一个指向QApplication对象的指针,该对象也是一个QCoreApplication,所以它也包含了exec()。

答案 1 :(得分:1)

qApp只是#defineQCoreApplication::instance()。所有qApp正在使用它正在告诉编译器在哪里找到exec()函数。但是因为exec()是一个静态函数,所以它不是通过一个对象调用的,即使你的代码看起来像它一样。因此,从编译器的角度来看,qApp->exec()应完全等同于QCoreApplication::exec()。也就是说,我不知道C ++标准在这种情况下是否需要qApp非空,即使它在技术上并不需要使用。

答案 2 :(得分:1)

QT在QApplication上使用单例模式,因此所有调用最终都会调用QApplication的单个实例。为什么他们选择将qApp放在一起骑行很奇怪,但它似乎是最短的字符串。我更喜欢将指针保存到您自己创建的原始QApplication中。