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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятное поведение программы при вызове диалогового окна  (Прочитано 3359 раз)
sk_alex
Гость
« : Август 25, 2006, 10:01 »

Доброго времени суток.

Столкнулся со следующей проблемой, которой никак не могу найти объяснение и решение.

Qt 3.3.3 под Windows + Visual C++ 6
Проблема: Есть класс диалогового окна MyDlgImpl, наследованный через класс MyDlg (сгенерированный Qt designer'ом) от QDialog.

В классе MyMainWindow (: public QMainWindow) есть метод, который пытается этот самый диалог вызвать:

void MyMainWindow::CallDlg()
{
    MyDlgImpl dlg;
    dlg.exec();
}

Когда я этот метод вызываю из функции обработки события на выбор пункта меню - все шикарно работает.

Однако мне нужно вызвать этот диалог не из меню программы, а по приходу события от другой нитки (thread'а) в программе. То есть мне нужно вызвать эту функцию из функции
MyMainWindow::customEvent (QCustomEvent *e)

При попытке же это сделать, я получаю "First-chance exception in MyProgram.exe (QT-MT333.DLL): 0xC0000005: Access Violation."  Грустный


Пытался поступить иначе.

Объявляю в классе MyMainWindow указатель на класс диалога:
MyDlgImpl *pdlg;

И в конструкторе класса MyMainWindow делаю ему new:
pdlg = new MyDlgImpl();

Поле этого в методе MyMainWindow::CallDlg() говорю:
pdlg->exec();

Диалог успешно появляется и работает, но его закрытие почему-то завершает работу всего приложения.  :shock:

Хорошо. Еще вариант: Вместо pdlg->exec(); набираю pdlg->show();
Имею зависание программы с появившимся на экране диалоговым окном.  :cry:

Как все это можно объяснить, что я делаю не так и как сделать правильно?  :oops:

Заранее благодарен всем откликнувшимся.

Upd: С последним вариантом (который pdlg->show()) все заработало - у меня просто по этому же событию еще и MessageBox вылетал и ждал реакции пользователя. С убиранием его - все стало работать.

Тему удалять не буду, дабы если у кого возникнут аналогичные проблемы, увидел решение. Ну и заодно может быть кто-нибудь мне пояснит, почему предыдущие описанные варианты приводят к таким неожиданным результатам.
Записан
bigirbis
Гость
« Ответ #1 : Август 25, 2006, 11:47 »

Похоже на то, что у тебя евент создавался и обрабатывался в отдельном потоке. Как следствие - диалог тоже. А, как известно, ГУИ должны работать только в гуёвом потоке. Отсюда, наверное, и проблемы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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