Russian Qt Forum

Qt => Общие вопросы => Тема начата: savigm от Январь 09, 2010, 18:09



Название: как сделать несколько диалоговых окон в приложении
Отправлено: savigm от Январь 09, 2010, 18:09
Подскажите пожалуйста: как в kdevelop сделать несколько диалоговых окон, чтобы в начале запускалось первое, по нажатию кнопки появилось второе окно, первое при этом закрылось, по нажатию кнопки во втором окне чтобы переключались опять в первое, а второе при этом закрылось?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 09, 2010, 20:14
Я как раз хотел создать похожую тему, только у меня проблемы при добавлении новой формы в Visual Studio 2005. При помощи QTCreator создаю вторую форму, по сути создаю проект, он мне генерит все нужные классы к этой форме. Затем беру .ui .cpp и .h  и копирую в папку с проектом для Studio. Затем в самой студии добавляю эти файлы в проект, затем нужно настроить проперти для нового ui файла, копируем все настройки со старой формы. Если после этого запустить апликэйшен то получю несколько ошибок, одна из них

unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Preview::metaObject(void)const " (?metaObject@Preview@@UBEPBUQMetaObject@@XZ)

думаю, что эта ошибка из-за того, что для моей новой добавленной формы не генерируется moc файл. Если просмотреть *.vcproj то увидим что для новой формы не прописаны настройки moc. А для старой формы они есть. Можно попробывать в самом файле добавить их, но не хотелось бы править файл руками. Ведь должно же где-то в настройках студии это задаваться. Но где?

А может есть способ по проще добавления новой формы для студии?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Hellraiser от Январь 09, 2010, 20:35
Цитировать
А может есть способ по проще добавления новой формы для студии?
Надо поставить интегратор для студии - для версии 4.6.0 (http://get.qt.nokia.com/vsaddin/qt-vs-addin-1.1.2.exe) или для версии 4.5.3 (http://get.qt.nokia.com/vsaddin/qt-vs-addin-1.1.1.exe). Для студии версии Express этот вариант не подходит - она не поддерживает аддоны. Хотя в свое время для Qt3 решал эту проблему с помощью своих Custom Build Rules.


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: savigm от Январь 09, 2010, 20:43
я примерно разобрался, но проблема в следующем:
1. по нажатию кнопки в первом окне создаю объект класса второго окна, отображаю его и скрываю первое окно:
Код:
SecondDlg *seconddlg = new SecondDlg;
seconddlg->show();
firstDlg->hide();
2. по нажатию кнопки во втором окне надо закрыть второе, отобразить первое и переключиться в него, вот здесь пока не знаю как это сделать:
Код:
firstDlg->show();

show не отображает первое окно вновь, не знаю как закрыть второе окно по нажатию кнопки???


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 09, 2010, 20:46
2Hellraiser
интегратор для 4.6.0 я уже поставил, но встал криво. Нет дополнительного пункта меню QT, хотя QT проект создать можно. Попробую поставить для 4.5.3.

Отвечу на свой вопрос(без интегратора)

qmake -project (обновили .pro с учётом новых файлов)
qmake -tp -vc (обновили .vcproj)

и новая форма добавлена в проект корректно.


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: zenden от Январь 10, 2010, 12:02
а интегратор для qt 4.6.0 поддерживает редактирование виджетов прямо внутри окна Visual Studio?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Hellraiser от Январь 10, 2010, 12:56
Только для обладателей коммерческой версии. Бесплатный только вызывает стандартный дизайнер.


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 10, 2010, 20:37
Если в главном окне создать вторую форму, то что бы во второй форме получить доступ к контролам первой формы, нужно через отдельный метод или через конструктор передать главное окно?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Авварон от Январь 10, 2010, 21:12
можно и так, но это плохой стиль.
Лучше, если главная форма сама достанет что ей надо, из дочернего класса


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 10, 2010, 21:29
Пользователь нажал на кнопку на второй форме и мне нужно вызвать метод из первой формы. Не предстовляю как ещё это можно сделать, как не передать MainWindow второй форме. Плохая архитектура приложения?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: BRE от Январь 10, 2010, 21:32
Пользователь нажал на кнопку на второй форме и мне нужно вызвать метод из первой формы. Не предстовляю как ещё это можно сделать, как не передать MainWindow второй форме. Плохая архитектура приложения?
Не вдаваясь в обсуждения архитектуры....

В первой форме сделать слот и соединить сигнал от кнопки на второй форме с этим слотом.


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 10, 2010, 21:42
Цитировать
В первой форме сделать слот и соединить сигнал от кнопки на второй форме с этим слотом.
у меня была такая идея, но её сразу откинул, т.к. не знал как такое сделать для кнопок находящихся на разных формах. Не будет ли маленького примера?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 10, 2010, 21:54
а ну всё кажется понял
connect(mPreviewForm->ui->stopRecording, SIGNAL(clicked()), this, SLOT(on_startButton_clicked()));

только мне пришлось паблик сделать ui. Или это тоже плохой стиль программирования?


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Hellraiser от Январь 10, 2010, 21:56
Если взять за основу код из предыдущих постов, то примерно так (чтобы не делать элементы интерфейса пабликом):
Код:
SecondDlg *seconddlg = new SecondDlg;
connect(seconddlg, SIGNAL(buttonPressed()), this, SLOT(mySlot()));
seconddlg->show();
firstDlg->hide();
В конструкторе SecondDlg пишем (после создания кнопки):
Код:
connect(myButton, SIGNAL(clicked()), this, SIGNAL(buttonPressed()));
и определить сигнал buttonPressed() в заголовочнике SecondDlg.


Название: Re: как сделать несколько диалоговых окон в приложении
Отправлено: Awejk от Январь 10, 2010, 22:03
2Hellraiser
интересная цепочка получилась, хоть не надо будет паблик делать. Спасибо.