如果我使用qApp->exec()
实例,是否有效拨打QCoreApplication::exec()
或QApplication
?由于它是一个静态函数,因此在两种情况下都会调用QCoreApplication::exec()
。然而,似乎即使我打电话给其中一个,我的基于QApplication
的程序运行得很好 - 这只是运气/巧合还是有效?
感谢您的帮助!
答案 0 :(得分:1)
简短回答:
这不是运气,因为静态函数的行为也应该像普通的非虚函数一样。
答案很长:
静态函数是不使用 this 指针的成员函数。当你从一个对象中调用它时,它的行为就像一个普通的成员。
由于QAppliction派生自QCoreApplication,而exec()是QCoreApplication的成员,因此它也是从QCoreApplication派生的类型对象的成员。
qApp返回一个指向QApplication对象的指针,该对象也是一个QCoreApplication,所以它也包含了exec()。
答案 1 :(得分:1)
qApp
只是#define
到QCoreApplication::instance()
。所有qApp
正在使用它正在告诉编译器在哪里找到exec()
函数。但是因为exec()
是一个静态函数,所以它不是通过一个对象调用的,即使你的代码看起来像它一样。因此,从编译器的角度来看,qApp->exec()
应完全等同于QCoreApplication::exec()
。也就是说,我不知道C ++标准在这种情况下是否需要qApp
非空,即使它在技术上并不需要使用。
答案 2 :(得分:1)
QT在QApplication上使用单例模式,因此所有调用最终都会调用QApplication的单个实例。为什么他们选择将qApp放在一起骑行很奇怪,但它似乎是最短的字符串。我更喜欢将指针保存到您自己创建的原始QApplication中。