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