Russian Qt Forum
Октябрь 02, 2024, 01:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модальный QMainWindow  (Прочитано 11439 раз)
Alexandr_Sky
Гость
« : Июль 26, 2007, 13:48 »

В общем-то сабж.

Необходимо из приложения открыть QMainWindow, так, чтобы само приложение ожидало закрытия этого окна. Если использовать метод show(), то окно не модальное.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Июль 26, 2007, 14:37 »

setAttribute(Qt::WA_ShowModal, true);

Можно управлять ещё видом модельности при помощи setWindowModality
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alexandr_Sky
Гость
« Ответ #2 : Июль 26, 2007, 14:56 »

Не прокатывает.
Окно не реагирует, но функция из которой открывается продолжает выполнятся. Т.е. код, который должен обрабатывать результаты, выполняется не после закрытия окна, а сразу.
Записан
QCasper
Гость
« Ответ #3 : Июль 26, 2007, 15:05 »

Цитата: "Alexandr_Sky"
Не прокатывает.
Окно не реагирует, но функция из которой открывается продолжает выполнятся. Т.е. код, который должен обрабатывать результаты, выполняется не после закрытия окна, а сразу.


Основная задача заключается в достижении выполняемости некоторого кода именно после закрытия окна, или в достижении получения модальности окна?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июль 26, 2007, 15:11 »

Только что создал тестовый пример, все работает

Код:

Test::Test(QWidget *parent)
    : QMainWidget(parent)
{
QMainWindow *window = new QMainWindow(this);
window->setWindowTitle("Modal");
window->setAttribute(Qt::WA_ShowModal, true);
window->setWindowModality(Qt::ApplicationModal);
window->show();

setWindowTitle("Non-Modal");
}


Можно конечно ещё добавить
window->setWindowFlags( window->windowFlags() | Qt::WindowStaysOnTopHint );

Для того чтобы закрыть окно "Non-Modal" я должен закрыть окно "Modal". Если это не то чно нужно, тогда я просто не понял сути вопроса
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alexandr_Sky
Гость
« Ответ #5 : Июль 26, 2007, 15:14 »

Ну в принципе и то и то.

Сейчас подумал, можно связать сигнал закрытия дополнительного окна со слотом в основном окне, а модальность сделать setAttribute(Qt::WA_ShowModal, true);
Но нет ли более простого варианта?
Хотя и этот сложным никак назвать нельзя. Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Июль 26, 2007, 15:21 »

А что не так? Какова суть коннекта сигнал закрытия дополнительного окна со слотом в основном окне?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alexandr_Sky
Гость
« Ответ #7 : Июль 26, 2007, 15:25 »

Возьмем для примера такой код:
Код:
Test::Test(QWidget *parent)
    : QMainWidget(parent)
{
   QMainWindow *window = new QMainWindow(this);
   window->setWindowTitle("Modal");
   window->setAttribute(Qt::WA_ShowModal, true);
   window->setWindowModality(Qt::ApplicationModal);
   window->show();
   
   qDebug("666");
}

так вот надо, чтобы "666" в консоли появилось только после закрытия дополнительного окна. А так появляется сразу.
Записан
vaprele07
Гость
« Ответ #8 : Июль 26, 2007, 15:30 »

можно вот так сделать
Код:

while (windows->isVisible())
   QApplication::processEvents();
Записан
Alexandr_Sky
Гость
« Ответ #9 : Июль 26, 2007, 15:31 »

Суть такова:
Основное окно открывает дополнительное, результатом работы которого будет некая информация. После закрытия дополнительного окна эту инфу надо получить в основном окне. Кроме того, надо, чтобы пользователь во время работы в доп. окне не мог ничего нажать в основном.
Соответственно можно из одной функции открыть окно, и сделать слот, который будет вызываться по закрытию доп. окна. В нем уже брать результаты из класса доп. окна и обрабатывать.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Июль 26, 2007, 15:34 »

Имхо, тогда уже сделай свой класс диалога на базе QMainWindow и заюзай QEventLoop. Такое решение будет давольно простым и на мойвзгляд правильным
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alexandr_Sky
Гость
« Ответ #11 : Июль 26, 2007, 15:35 »

Всем спасибо!
Отдельное спасибо vaprele07. Улыбающийся
С циклом отлично работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.