| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Как правильно писать код?? |
| Автор: dmitrio 7.9.2011, 12:48 | ||||
| Изучив наверное крайнюю малость C++, Qt, я кажется начинаю понимать, что я не знаю абсолютно ничего. Сейчас нахожусь в ступоре, вроде и книги всякие читал, но какая-то дыра в голове образовалась. Для чего нужен файл main.cpp? Вот к примеру сейчас в данное время, у меня в main.cpp есть следующее:
По моей логике должно быть так, если файла БД не найдено, то все виджеты главного окна становятся не активными (w.closeWidgets(); ) открывается мастер создания БД (w.create_db();) там заполняются данные, база создается, и далее после закрытия мастера все виджеты становятся активными (w.openWidgets();) Но в данное время оно работает не так, сначала все виджеты главного окна становятся не активными, потом создается мастер (QWizard) и сразу же не дожидаясь выполняется w.openWidgets(), т.е все виджеты становятся активными. Есть мысли что w.openWidgets(); надо вешать на QWizardbutton::Finishbutton. Также есть мысли, что я все делаю не так. Скачивал разные исходники программ из инета на qt и везде в файле main.cpp, кроме:
больше ничего нет. Может быть все это мне пока тяжело дается потому что с ООП совсем мало знаком. В общем-то вопрос для чего нужен main.cpp? А то может можно и без него все делать, ну имею в виду только оставить выше указанный код с инклудами. Сейчас буду рыться в примерах от qt может там на меня просвещение снизойдет |
| Автор: Greeneyed 7.9.2011, 15:06 |
| Никто не мешает тебе сделать проверку существования файла БД в конструкторе MainWindow. |
| Автор: bsa 7.9.2011, 15:52 |
| Весь GUI строится на основе сообщений. Поэтому задач у main() всего две: создать основное окно и запустить обработчик событий (app.exec()). Далее на каждый чих пользователя окну посылается сообщение, которое оно обрабатывает и совершает ряд действий. Ты же пытаешься писать "синхронный" код (кстати, не очень понятно, что у тебя внутри create_db(), но подозреваю, что собака порылась именно там). Т.е. ты предполагаешь, что метод show() не возвращается сразу. А это не так. У класса QDialog и его потомков (QWizard в т.ч.) есть слот exec(), который работает в блокирующем режиме (т.е. как любая синхронная функция). Думаю, тебе нужно вызывать именно его вместо show(). |
| Автор: dmitrio 8.9.2011, 05:55 | ||||||
Спасибо за ответы. Шел сегодня на работу как раз об этом и думал.
в конструкторе MainWindow:
Wizard экземпляр QWizard. Вот такой подход у меня был. Использование exec() решило проблему, но я так понимаю синхронное программирование не правильный путь?
Я так понимаю сигнал-слот? В любом случае спасибо bsa за помощь!! |
| Автор: alexvs11 8.9.2011, 10:07 |
нет на обработке наследников QEvent у каждого объекта в Qt, унаследованного от QObject (в том числе у QWidget и QApplication) есть очереди сообщений и и возможность их обработки там все хитро, но общий смысл такой, формировать event'ы и обрабатывать можете даже сами |
| Автор: Lindemann66 14.9.2011, 09:12 |
main.cpp - точка входа в программу |
| Автор: dmitrio 15.9.2011, 06:26 |
| Ну про точку входа это понятно, я имел в виду есть ли смысл писать в этом файле основной код. Но вопрос уже решен. Спасибо |