Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mikhail_t от Апрель 06, 2011, 10:36



Название: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: mikhail_t от Апрель 06, 2011, 10:36
Здравствуйте.
 
Есть: Dialog1 и Dialog2, унаследованные от QDialog.
Задача: из Dialog1 вызвать Dialog2, при этом dialog1 на время показа dialog2 должен быть скрыт.
Зачем: во время заполнения Dialog2 пользователь должен видеть QGraphicsScene, а большой Dialog1 перекрывает ее почти всю
Решение: см. код
Результат: после закрытия Dialog2 на мгновение появляется Dialog1 и тут же исчезает.
Просьба: подскажите пожалуйста, в чем я ошибаюсь.

void Dialog1::showDialog2()
{
    // Прячу dialog1. Спрятался.
    setVisible(false);

    // Вызываю Dialog2. Появился.
    Dialog2* d = new Dialog2(this);
    int result = d->exec();
    if (result == 1) {
          // забираю данные из вызванной формы
    }
     
    // Делаю Dialog1 видимым. На мгновение появился и пропал
    setVisible(true);

}


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: Пантер от Апрель 06, 2011, 10:43
Не должно. Может у тебя приложение падает?


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: mikhail_t от Апрель 07, 2011, 01:47
Нет, приложение у меня не падает.

Могу даже сказать следующее: Dialog1 пропадает, но не уничтожается. Потому что после приведенного фрагмента кода я могу обратиться к его нестатическим методам и приложение не падает (т.е. объект Dialog1 существует).


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: Пантер от Апрель 07, 2011, 07:23
Приложи минимальный компилябельный пример.


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: mikhail_t от Апрель 07, 2011, 12:00
Минимальный пример, в котором только два диалога, работает нормально. А проблема такая возникает в большом проекте (сетевой симулятор). Выкладывать сюда проект размером в полсотни классов (мой труд в течение 6 месяцев) - никто разбираться не будет. Основное отличие минимального проекта от большого - в большом Dialog1 вызывается по клику на QGraphicsItem. Все, больше я не вижу никаких отличий и это озадачивает.

Я понимаю, что при такой скудной информации посоветовать что-то сложно. Поэтому, буду благодарен, если Вы просто предположите несколько причин, по которым такая проблема может возникать теоретически. А я уж сам их проработаю на практике.
Если нет, то, думаю, тему можно закрывать, так как здесь для других полезного ничего не будет.


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: Пантер от Апрель 07, 2011, 12:07
Покажи код вызова Dialog1.


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: mikhail_t от Апрель 07, 2011, 12:25
Код:
Dialog1* dialog1 = new Dialog1();
int result = dialog1->exec();

Т.е. пользователь щелкает 2 раза по QGraphicsItem'у, и в обработчике выполняется этот код. Родитель для Dialog1 не назначаю, так как элемент сцены не является QWidget'ом.


Название: Re: Как спрятать QDialog, когда из него вызывается другой QDialog
Отправлено: mikhail_t от Сентябрь 10, 2011, 16:06
Совершенно случайно наткнулся на решение позабытой проблемы. Нужно делать так:
Код:
void Dialog1::showDialog2()
{
    // Прячу dialog1. Спрятался.
   QWidget::setVisible(false);

    // Вызываю Dialog2. Появился.
    Dialog2* d = new Dialog2(this);
    int result = d->exec();
    if (result == 1) {
          // забираю данные из вызванной формы
    }
      
    // Делаю Dialog1 видимым. Теперь не пропадает!
    QWidget::setVisible(true);
}

Вдруг кто-то тоже столкнется с этой проблемой.