Графический интерфейс редактирования дочернего потока Qt4 в основном потоке

У меня есть tablewidget, к которому нужно добавить данные из дочернего потока.

Я получаю сообщение об ошибке Небезопасно использовать растровые изображения вне потока GUI. В С# я использовал Disptacher, чтобы сообщить mainThread о добавлении данных в объект графического интерфейса.

Я предполагаю, что есть что-то близкое к этому? Я использую qt4.7. Я сделал слот в родительском объекте и сигнал в объекте потока.. испускающий сигнал из дочернего потока для отправки сигнала в слот в родительском. но сигнал не идет. когда я выполняю такой метод, как object->run(); (то есть из mainthread) он работает нормально... но когда я запускаю его из объекта потока->start(); сигнал не срабатывает.. мне нужно сделать кое-что с потоком, не входящим в основной поток..

ОБНОВЛЕНИЕ — 27/09 я только что добрался до корня проблемы.. сигнал и слот работают, но дочерний поток запускает объект qnetworkaccessmanger, который вызывает все эти проблемы.. я прокомментировал объект networkaccess и никаких ошибок. Мне нужно, чтобы поток вызывал сетевой запрос.. и обновлял результаты в графическом интерфейсе..


person Agent_Smith    schedule 26.09.2011    source источник


Ответы (1)


Самый простой способ — использовать механизм сигналов/слотов Qt с типом соединения Qt::QueuedConnection. Это ставит в очередь вызов слота в потоке, в котором объект-получатель живет автоматически.

person Steffen    schedule 26.09.2011
comment
также .. у меня есть куча потоков, а не только один, который будет добавлять данные .. поэтому я создал слот в родительском элементе .. и испустил сигнал из потока. я попытался переместить указатель родителя в класс потока, но... я не могу сделать то, что он говорит.. QObject: невозможно создать дочерние элементы для родителя, который находится в другом потоке. - person Agent_Smith; 26.09.2011
comment
о.. я что-то меняю... я понял, что мне не нужна родительская ссылка в дочернем элементе.. - person Agent_Smith; 26.09.2011
comment
Я сделал слот в родительском объекте и сигнал в объекте потока.. испускающий сигнал из дочернего потока, чтобы отправить сигнал в слот в родительском элементе.. это тоже не работает. это приводит к той же ошибке. Небезопасно использовать растровые изображения вне потока графического интерфейса. когда я делаю object-›run(); без слов object-›start(); он отлично работает в основном потоке. но объект-›start(); вылетает ошибка.. - person Agent_Smith; 27.09.2011
comment
Похоже, вы каким-то образом все еще работаете с растровым изображением в потоке, отличном от пользовательского интерфейса. Было бы полезно, если бы вы разместили какой-нибудь минимальный пример кода. - person Steffen; 27.09.2011
comment
я только что добрался до корня проблемы.. сигнал и слот работают, но дочерний поток запускает объект qnetworkaccessmanger, который вызывает все эти проблемы.. я прокомментировал объект networkaccess и нет ошибки.. мне нужен поток для вызова сетевой запрос.. и обновить результаты в графическом интерфейсе.. - person Agent_Smith; 27.09.2011
comment
хорошо, я решил... я использовал объект qeventloop в дочернем элементе... я удалил его... и вуаля... работает как часы. но мне пришлось менеджер-›moveToThread(это) в дочернем элементе.. даже если я создал менеджер в дочернем элементе. - person Agent_Smith; 27.09.2011