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



如果我使用QApplication实例,调用qApp->exec()QCoreApplication::exec()是否有效?因为它是一个静态函数,所以在这两种情况下都将调用QCoreApplication::exec()。然而,似乎即使我调用其中一个,我的QApplication为基础的程序工作得很好-这只是运气/巧合或它是有效的?

谢谢你的帮助!

简短回答:

这不是运气,因为静态函数也应该表现得像普通的非虚函数。

长答:

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

由于qapplication是从QCoreApplication派生出来的,而且exec()是QCoreApplication的成员,所以它也是从QCoreApplication派生出来的类型对象的成员。

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

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

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

最新更新