2015-10-24 10 views
1

Действительно ли можно позвонить qApp->exec() или QCoreApplication::exec(), если я использую экземпляр QApplication? Поскольку это статическая функция, в обоих случаях будет вызываться QCoreApplication::exec(). Тем не менее, похоже, что даже если я назову один из них, моя программа на основе QApplication работает просто отлично - это просто удача/совпадение или это правда?Является ли qApp-> exec() действительным, если используется QApplication

Благодарим за помощь!

ответ

1

Короткий ответ:

Это не везение, так как статические функции должны вести себя как нормальные, не виртуальные функции также.

Длинный ответ:

Статическая функция является элементом, который не использует этот указатель. Когда вы вызываете его из объекта, он ведет себя как обычный член.

Поскольку QAppliction является производным от QCoreApplication, а exec() является членом QCoreApplication, он также является членом объектов типов, полученных из QCoreApplication.

qApp возвращает указатель на объект QApplication, который также является QCoreApplication, поэтому он также связывает exec().

+0

qApp не является функцией, поэтому вы не можете назвать его как один (то есть qApp() является ошибкой). Объектом, который предоставляет qApp, является объект QCoreApplication, а не объект QApplication. –

+0

Вы правы, это всего лишь макрос, и использование() является ошибкой. Тем не менее, опираясь на тип приложения, он подчиняется реальному типу экземпляра. Например, если вы включите QWidgets, он будет передан в QApplication. –

+0

Ouch. Итак, что означает qApp, зависит от того, какие заголовки вы включаете. :( –

1

qApp - это просто #define до QCoreApplication::instance(). Все qApp делает в вашем использовании это говорит компилятору, где найти функцию exec(). Но поскольку exec() является статической функцией, он не вызывается через объект, хотя ваш код делает его похожим на него. Таким образом, qApp->exec() должен быть полностью эквивалентен QCoreApplication::exec() с точки зрения компилятора. Тем не менее, я не знаю, требовал бы, чтобы в стандарте C++ qApp был ненулевым, даже если его технически не нужно использовать.

+1

Чтобы быть понятным, как упоминалось в @ dragos-pop, QApplication является всего лишь подклассом QCoreApplication. В исходном вопросе не имеет значения, создает ли ваше приложение объект QCoreApplication или объект QApplication , вы все равно можете вызвать exec() таким же образом. –

1

QT использует однотонный шаблон для QApplication, поэтому все ваши вызовы в конечном итоге вызывают один экземпляр QApplication. Почему они выбрали qApp для поездки, это странно, но, кажется, самая короткая строка для ввода. Я предпочитаю держать указатель на исходном QApplication, который вы создали сами.

+0

Я считаю, что qApp - это историческое похмелье с самых ранних дней Qt. Возможно, он начал свою жизнь как реальная глобальная переменная, но, как я уже сказал, теперь это просто #define для QCoreApplication :: instance(). По-видимому, он был сохранен, чтобы позволить более раннему коду продолжать работу с минимальными изменениями кода, когда люди обновляются до более новых версий Qt. –