Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Модальный QMainWindow 
V
    Опции темы
Brodyaga
Дата 3.11.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Всем привет!

Помоему уже гдето обсуждалось.. Нужно сделать чтобы QMainWindow вызывался как модальная форма и метод show задерживал поток подобно методу exec, как это сделать?

P.S.
mainWindow->setWindowModality(Qt::WindowModal);
mainWindow->setWindowFlags(Qt::Dialog);
не помогают...
PM MAIL   Вверх
chaos
Дата 3.11.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



а можно узнат ьчто вы пытаетесь сделать?!
PM WWW   Вверх
Brodyaga
Дата 3.11.2010, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

а можно узнат ьчто вы пытаетесь сделать?!


Модальный QMainWindow
PM MAIL   Вверх
SABROG
Дата 3.11.2010, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Brodyaga @ 3.11.2010,  17:00)
Цитата

а можно узнат ьчто вы пытаетесь сделать?!


Модальный QMainWindow

А как главное окно программы может вообще быть модальным? Это бы запретило вообще переключение между окнами на рабочем столе или на другую открытую программу...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Brodyaga
Дата 3.11.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2




Цитата

А как главное окно программы может вообще быть модальным? Это бы запретило вообще переключение между окнами на рабочем столе или на другую открытую программу...


У меня это не главное окно программы. Сначала это было окно появляющееся в Mdi области, теперь понадобилось переделать его в обычное модальное окно. Но на самом деле у меня таких окон много, поэтому чтобы не переделывать наследование на QDialog хочу сделать QMainWindow модальным.
PM MAIL   Вверх
SABROG
Дата 3.11.2010, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



А флаги ставил с учетом этого комментария?

Цитата

Changing this property while the window is visible has no effect; you must hide() the widget first, then show() it again.



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
chaos
Дата 3.11.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(Brodyaga @  3.11.2010,  14:09 Найти цитируемый пост)
чтобы не переделывать наследование на QDialog хочу сделать QMainWindow модальным

имхо это корявое решение
PM WWW   Вверх
Brodyaga
Дата 3.11.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

А флаги ставил с учетом этого комментария?

Создал окно, поставил флаги, а затем вызвал show. Тоесть в момент постановки флагов, окно не было показано на экране.

Это сообщение отредактировал(а) Brodyaga - 3.11.2010, 18:20
PM MAIL   Вверх
Brodyaga
Дата 4.11.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Нашёл вот здесь вариант с циклом.
Вроде работает.. Насколько корректен такой подход?
PM MAIL   Вверх
SABROG
Дата 5.11.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Brodyaga @  4.11.2010,  15:16 Найти цитируемый пост)
Насколько корректен такой подход? 


Настолько насколько он тебя устраивает по функциональности и топорности решения.

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

Код

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowModality(Qt::ApplicationModal);
}

int MainWindow::exec()
{
    QStateMachine stateMachine;

    QState* modal = new QState;
    QFinalState* done = new QFinalState;

    QEventTransition* transHide = new QEventTransition(this, QEvent::Hide);
    transHide->setTargetState(done);

    modal->addTransition(transHide);

    QEventTransition* transClose = new QEventTransition(this, QEvent::Close);
    transClose->setTargetState(done);

    modal->addTransition(transClose);

    stateMachine.addState(modal);
    stateMachine.addState(done);
    stateMachine.setInitialState(modal);

    connect(&stateMachine, SIGNAL(finished())
            , QCoreApplication::instance(), SLOT(quit()));

    stateMachine.start();

    show();
    return QCoreApplication::exec();
}


Конечно длинный, но не "насильный" while.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Brodyaga
Дата 5.11.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Спасибо за вариант, но у меня проект пока на 4.4.3, так что QStateMachine нету.
Так что буду пока использовать найденное мной решение с QApplication::processEvents().
Всем спасибо! Тема закрыта.
PM MAIL   Вверх
SABROG
Дата 5.11.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Brodyaga @  5.11.2010,  15:02 Найти цитируемый пост)
Спасибо за вариант, но у меня проект пока на 4.4.3, так что QStateMachine нету.

Легко меняется на переопределение методов closeEvent() и hideEvent(), а в них уже выход из цикла.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.