Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alexandr_Sky от Июль 26, 2007, 13:48



Название: Модальный QMainWindow
Отправлено: Alexandr_Sky от Июль 26, 2007, 13:48
В общем-то сабж.

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


Название: Модальный QMainWindow
Отправлено: pastor от Июль 26, 2007, 14:37
setAttribute(Qt::WA_ShowModal, true);

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


Название: Модальный QMainWindow
Отправлено: Alexandr_Sky от Июль 26, 2007, 14:56
Не прокатывает.
Окно не реагирует, но функция из которой открывается продолжает выполнятся. Т.е. код, который должен обрабатывать результаты, выполняется не после закрытия окна, а сразу.


Название: Модальный QMainWindow
Отправлено: QCasper от Июль 26, 2007, 15:05
Цитата: "Alexandr_Sky"
Не прокатывает.
Окно не реагирует, но функция из которой открывается продолжает выполнятся. Т.е. код, который должен обрабатывать результаты, выполняется не после закрытия окна, а сразу.


Основная задача заключается в достижении выполняемости некоторого кода именно после закрытия окна, или в достижении получения модальности окна?


Название: Модальный QMainWindow
Отправлено: pastor от Июль 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". Если это не то чно нужно, тогда я просто не понял сути вопроса


Название: Модальный QMainWindow
Отправлено: Alexandr_Sky от Июль 26, 2007, 15:14
Ну в принципе и то и то.

Сейчас подумал, можно связать сигнал закрытия дополнительного окна со слотом в основном окне, а модальность сделать setAttribute(Qt::WA_ShowModal, true);
Но нет ли более простого варианта?
Хотя и этот сложным никак назвать нельзя. :)


Название: Модальный QMainWindow
Отправлено: pastor от Июль 26, 2007, 15:21
А что не так? Какова суть коннекта сигнал закрытия дополнительного окна со слотом в основном окне?


Название: Модальный QMainWindow
Отправлено: Alexandr_Sky от Июль 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" в консоли появилось только после закрытия дополнительного окна. А так появляется сразу.


Название: Модальный QMainWindow
Отправлено: vaprele07 от Июль 26, 2007, 15:30
можно вот так сделать
Код:

while (windows->isVisible())
   QApplication::processEvents();


Название: Модальный QMainWindow
Отправлено: Alexandr_Sky от Июль 26, 2007, 15:31
Суть такова:
Основное окно открывает дополнительное, результатом работы которого будет некая информация. После закрытия дополнительного окна эту инфу надо получить в основном окне. Кроме того, надо, чтобы пользователь во время работы в доп. окне не мог ничего нажать в основном.
Соответственно можно из одной функции открыть окно, и сделать слот, который будет вызываться по закрытию доп. окна. В нем уже брать результаты из класса доп. окна и обрабатывать.


Название: Модальный QMainWindow
Отправлено: pastor от Июль 26, 2007, 15:34
Имхо, тогда уже сделай свой класс диалога на базе QMainWindow и заюзай QEventLoop. Такое решение будет давольно простым и на мойвзгляд правильным


Название: Модальный QMainWindow
Отправлено: Alexandr_Sky от Июль 26, 2007, 15:35
Всем спасибо!
Отдельное спасибо vaprele07. :)
С циклом отлично работает.