QMessageBox & QThread

Автор: peter_ir Дата: 17.02.2008 21:52 Здравствуйте!

Возникла неожиданная трудность с QMessageBox и QThread в Qt-3.3.6, скомпилирована
из исходников. Оказалось, что если я создаю поток на основе QThread, то в нём
невозможно вывести на дисплей элемент типа QMessageBox функцией exec - вся
программа зависает, так что приходится удалять её с помощью kill. show работает,
но мне желательно именно с помощью exec, а не Static Public Members.
Кто-нибудь может сказать, это bug или есть какая-то тонкость?
Re: QMessageBox & QThread 04.03.2008 12:40peter_ir Оказалось, что это не трудно, главное, что для потока, из которого выводится
сообщение, не надо вызывать wait.

1) Сообщение выводится методом exec.
Создать свой класс на основе QThread с переменными для хранения указателя на
вызвавшую программу, адресом для кода возврата exec и парамерами для сообщения,
все это передавать в конструктор, в нем создать экземпляр QMessageBox оператором
new и вызвать для него exec. В run можно присваивать код возврата и посылать
сообщение вызвавшей программе. В этой программе создать экземпляр этого класса
оператором new и вызвать для него start.

2) Сообщение выводится методом show.
Создать свой класс на основе QObject и QThread с флагом проверки закрытия
сообщения и слотом для сброса этого флага, с переменными для хранения
указателя на вызвавшую программу и парамерами для сообщения и передавать их в
конструктор, в нем создать экземпляр QMessageBox оператором new с mode=FALSE
и флагами WStyle_DialogBorder|WDestructiveClose, установить флаг проверки,
соединить сигнал destroyed сообщения и слотом для его сброса и вызвать для него
show. В run в бесконечном цикле по состоянию флага усыплять поток командой
msleep(<val>;-), также можно послать сообщение вызвавшей программе. В этой
программе создать экземпляр этого класса оператором new и вызвать для него
start.
Бесконечный цикл - это, наверное, не лучшее решение, но простое.

Аналогично 2) можно выводить свой диалог, созданный на основе QDialog.

Это проверялось в Qt-3.3.6.

Петр.
RSS-материал