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
  опции профиля:
сообщение 15.11.2008, 16:49
Сообщение #2


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

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

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




Репутация:   94  


Raw Gift, может имело бы смысл создать слот в this, а в myThread сигнал. И сигналить this'у о том, что надо диалог отобразить и передать через сигнально-слотовую связь нужные значения для QListWidget.
А также сигнал в this и слот в myThread для возвращения выбраного значения пользователем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Raw Gift
  опции профиля:
сообщение 15.11.2008, 23:12
Сообщение #3


Новичок


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

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




Репутация:   0  


Litkevich Yuriy, я вас немного не понял.

Вы предлагаете создать слот для того чтобы выделение отображать? Ведь сам механизм работает, и QTreeWidget::currentIndex().row() отдает индекс выбранного элемента после закрытия диалога! Просто не отображается выделение, такое ощущение, что QTreeWidget Disabled или перекрывается другим модальным окном... Понимаю, что сложно понять из такого расплывчатного описания, но не знаю, получится ли воссоздать такое поведение в другой программе (к сожалению, исходники этой дать не могу, как и скомпилированную версию - закрытый код, который распространять я права не имею).

Попробую воссоздать такое поведение в другой программе, может быть, заодно и разберусь, что и как.

Прошу прощения, везде вверху, где упомянался QTreeWidget, должен быть QListWidget. Впрочем, сути это не меняет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.11.2008, 23:41
Сообщение #4


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

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

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




Репутация:   94  


Raw Gift, а версия Qt какая?
может попробывать для теста в другой собрать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Raw Gift
  опции профиля:
сообщение 18.11.2008, 3:03
Сообщение #5


Новичок


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

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




Репутация:   0  


Не знаю-не знаю... Мне тут подсказывают, что дедлок мог случиться. В принципе, очень логично: программа разбита на потоки, которые засинхронизированы несколько кривовато... Только вот откуда дедлок в этом конкретном месте... Черт его знает. В общем, как разберусь - напишу!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.11.2008, 4:27
Сообщение #6


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

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

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




Репутация:   94  


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

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


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




RSS Текстовая версия Сейчас: 9.11.2024, 1:35