2014-09-02 2 views
3

В проекте Qt мы обычно находим файл project.pro, main.cpp и несколько файлов заголовка, источника и *.ui, содержащий все ресурсы, чтобы вдохнуть жизнь и функции в приложение/проект. Если есть больше, чем «нажмите кнопку, чтобы показать" Привет, мир!», могут быть каталоги для хранения данных и файлов конфигурации и т.д.Роль «main.cpp» в проекте Qt

Мой вопрос (несмотря на то, что точный ответ зависит от конкретной ситуации):

Какова общая роль main.cpp в проекте Qt (приложение Qt Widgets)?


Для того, чтобы пояснить, что я имею в виду:

  1. ли main.cpp «s единственная цель пнуть приложение?
  2. Если нет, то каковы типичные задачи, которые должны выполняться main.cpp?
  3. Говоря о файлах конфигурации - рассмотрим, что приложение имеет основную форму, которая имеет (и, возможно, другие классы/диалоги, созданные также основной формой), чтобы узнать о некоторых данных конфигурации, извлеченных из файла. Инициализация произойдет в main.cpp или в MainForm. Короче говоря: «Настройка вещей ...» следует разместить там, где (в свете текущего вопроса)?
  4. Все, что вы чувствуете, как говорят ...
+3

Номенклатура является просто условной и в большинстве случаев не более чем признаком того, что файл содержит основную точку входа вашей программы, то есть функцию с сигнатурой 'int main()' или 'int main (int, char * *) '(не уверены, разрешена ли другая подпись стандартом). Когда вы используете мастер проекта, скажем, Qt Creator, и при условии, что вы разрешите ему создать проект Qt, он будет генерировать базовую структуру вашей программы, в том числе «main.cpp», которая содержит указанную точку входа и другие материал, среди которого вы найдете файл '.pro' и другие материалы. – thokra

ответ

5

(Примечание: полный ответ должен содержать комментарий @ thokra, то есть main.cpp - это имя файла, а внешний вид точки ввода программы в файле с этим именем - только конвенция, но это довольно хорошо, придерживался соглашения в программах Qt и C++ в целом, чтобы попытаться поместить точку входа в файл с таким именем.)

Одной из категорий будет регистрация глобальных привязок и настроек. Подумайте о таких вещах, как qInstallMessageHandler, или QTextCodec::setCodecForCStrings.

Инициализация любых не-Qt библиотек, которые ваше приложение хочет принять как должное, будет другой областью.

Если ваша программа имеет объект главного окна, который только создается и уничтожается один раз, может показаться одинаково подходящим для того, чтобы поместить код «запустить один раз» в его конструктор/деструктор. Но спросите себя, что это такое о вашем приложении, которое позволяет ему иметь только одно главное окно. Почему бы ему не иметь два в одном процессе? Даже если это не является частью требования сегодня, оно может предложить архитектурную границу.

В личном опыте я хочу упомянуть, что если вы попытаетесь создать класс, полученный из QApplication, а затем поместите свой глобальный run-once-code в конструктор и деструктор этого производного класса, это сложнее, чем кажется (особенно если вы создаете потоки и делаете виджеты в этом конструкторе). Поэтому я не думаю, что в большинстве сценариев вы должны получить от QApplication. Я застрял в этом, потому что я делал приложение рамки ... но избегайте этого, и ваш код запуска выполняется в main.cpp.

+0

Вы подтверждаете мои собственные предположения о том, что главное должно содержать то, что абсолютно необходимо для «запуска» приложения вообще и всего «кода запуска», если * нет MainForm, который будет создан только один раз. В моем конкретном проекте у меня есть только один MainForm (называемый «Home»), который вы можете рассматривать в командном центре пользователя, где он выполняет все операции. Если вы закроете его, вы закроете приложение. Поскольку я разделил свой проект на «логику» и «gui», подготовка к «логике» могла быть расположена в основном, подготовка к 'gui', например, чтение пользовательских настроек [...] – LCsa

+0

[...] из конфигурационный файл и т. д. будут находиться в 'Home' ... (Обратите внимание, что объект' Home' никогда не будет уничтожен во время выполнения). Вы «согласны» с моими идеями? (На самом деле, у меня есть класс «Настройки» (singleton), который заботится об этом, мне просто нужно решить, следует ли его задействовать в 'main.cpp' или' Home' ...) – LCsa

+0

@LCsa Хм, хорошо, не подходите с объектами с именами типа «Вселенная», а затем потому, что вы не хотите, чтобы глобальные переменные вы заканчивали передачу «Вселенной» каждой функции. Вы просто заново изобрели глобалы и добавили слой хлопот. Но подумайте: если я пришел к вашей базе кода и захотел написать приложение без GUI, которое является настройщиком настроек, сколько изменений мне нужно будет сделать? Почему для чтения настроек * требуется * создание окна? Просто рекомендации здесь, в конце дня никакие программы не идеальны, кроме [Red] (http://blog.hostilefork.com/why-rebol-red-parse-cool/)> :-P – HostileFork

3

«1. Является ли единственной целью в main.cpp, чтобы пнуть приложение?»

Как из [определение стандартов] 1 1-й раздел говорит:

3,6 Начало и окончание [basic.start]
3.6.1 Основная функция [basic.start .main]
Программа должна содержать глобальную функцию main, которая является назначенным началом программы. Он определяется реализацией, требуется ли программа в автономной среде для определения основной функции .
[Примечание: В автономной среде ввод в эксплуатацию и завершение определяются реализацией; startup содержит выполнение конструкторов для объектов пространства пространств имен со статической продолжительностью хранения; завершение содержит выполнение деструкторов для объектов со статической продолжительностью хранения. -end примечание]

приложение до сих пор используют C++, таким образом, это ограничение должно быть выполнено для любого исполняемого приложения. Предположительно: Да, цель main() - это запуск приложения.

MainForm и main() на самом деле не сильно связаны, кроме вашей конфигурации будет создана функция создания и вызова функции main(). Вы также можете иметь проекты Qt, которые вообще не имеют никакого экземпляра MainForm (например, просто приложение командной строки).

+0

Это поддерживало бы версию помещения материала в «MainForm» и позволяло 'main.cpp' просто удалять все ... – LCsa

+0

@LCsa _« Это поддерживало бы версию ... »_ Конечно! Полностью зависит от того, что предоставляет IDE Qt Creator для генерации 'main()' для определенного типа проекта. –