crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QDialog/QTreeWidget странно себя ведут, то ли с модальностью проблемы, то ли с фокусом...
Raw Gift
  опции профиля:
сообщение 15.11.2008, 15:23
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 15.11.2008
Пользователь №: 422

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, уважаемые форумчане!

Столкнулся с совершенно непонятной для меня проблемой. Есть небольшая программка, разбитая на два потока: поток GUI (основной, соответственно) и поток вычислений.

Механизм работы следующий: когда пользователь выставляет все настройки в GUI и нажимает кнопочку, запускаются вычисления в отдельном потоке. При этом в GUI перед созданием потока создается окошко с QProgressBar, которое вызывается после запуска потока:

myThread *thread = new myThread( this );
progressForm form;

thread->start();
form.exec();


При этом взаимодействуют поток вычислений и поток GUI (точнее говоря, progressForm) посредством сигналов. Не знаю, насколько это верное решение, но все работает прекрасно.

Кроме того, иногда в процессе вычислений может возникнуть "вопрос" к пользователю, т.е. надо показать диалоговое окошко с QListWidget с вариантами "ответа", и только после этого продолжать вычисления.

Я, не особо задумываясь, взял да и воткнул создание этого диалога в поток вычислений (т.к. вычисления все равно на время должны прерываться). После этого я просто получал результат (QListWidget::currentIndex().row()) и продолжал вычисления:

myListDialog dialog;
dialog.exec();

int selection = dialog.getIndex(); /* Это метод, который вызывает QListWidget::currentIndex().row() для QListWidget, расположенного в диалоговом окне */


Все работало замечательно, пока я не решил собрать программу в Debug-версии. Qt ругнулся на меня assert'ом, мол, нельзя создавать виджеты не в GUI потоке и я с ним согласился. Казалось бы, чего проще, создаем myListDialog внутри GUI потока и передаем указатель конструктору потока вычислений:

myListDialog dialog;
myThread *thread = new myThread( &dialog, this );
progressForm form;

thread->start();
form.exec();


Внутри потока вычислений все остается так же точно, как и было:

dialog->exec();

int selection = dialog->getIndex();


Но не тут-то было. Каким-то магическим образом получается так, что в QListWidget выделение не отображается, но результат выделения сохраняется. Причем, интересно, если нажать кнопочку Ок диалога, но убрать с нее курсор мышки, выделение таки покажется. Путем плясок с бубном и всякими focusPolicy, а также windowModality, мне удалось добиться того, что первый вариант выбора (кликнули первый раз в список) показывается, а остальные нет. Ума не приложу, что вообще происходит... :blink:

Искренне признателен за всякую помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 18.11.2008, 4:27
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Raw Gift @ 18.11.2008, 6:03) *
Только вот откуда дедлок в этом конкретном месте... Черт его знает
ну смотри общие переменные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 5:23