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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как спрятать QDialog, когда из него вызывается другой QDialog  (Прочитано 4429 раз)
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);

}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 06, 2011, 10:43 »

Не должно. Может у тебя приложение падает?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mikhail_t
Гость
« Ответ #2 : Апрель 07, 2011, 01:47 »

Нет, приложение у меня не падает.

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 07, 2011, 07:23 »

Приложи минимальный компилябельный пример.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mikhail_t
Гость
« Ответ #4 : Апрель 07, 2011, 12:00 »

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

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Апрель 07, 2011, 12:07 »

Покажи код вызова Dialog1.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mikhail_t
Гость
« Ответ #6 : Апрель 07, 2011, 12:25 »

Код:
Dialog1* dialog1 = new Dialog1();
int result = dialog1->exec();

Т.е. пользователь щелкает 2 раза по QGraphicsItem'у, и в обработчике выполняется этот код. Родитель для Dialog1 не назначаю, так как элемент сцены не является QWidget'ом.
Записан
mikhail_t
Гость
« Ответ #7 : Сентябрь 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);
}

Вдруг кто-то тоже столкнется с этой проблемой.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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