2009-11-20 4 views
2

В Qt объект принадлежит к потоку, на котором он был создан. Нам нужно получить доступ к элементам управления, созданным в основном потоке из фонового потока. Однако, как только мы ссылаемся на объект, приложение переходит в состояние зависания. Пожалуйста, дайте мне знать, как получить доступ и изменить элементы управления в другом потоке, который не создал элементы управления.Доступ к виджету Qt из другой темы

Заранее спасибо.

ответ

0

Попробуйте передать указатель класса на конструктор.

1

Вы можете подать сигнал из фонового потока, который будет выполняться в прорези основного потока. Если я правильно помню, это делается автоматически, если вы укажете Qt :: AutoConnection в соединении.

1

У вас возникнут проблемы с доступом ко многим части кода, определенным для Qt, из одного потока для объекта, принадлежащего другому потоку. Самый простой способ - использовать сигналы и слоты, как предложено OregonGhost. Если этого недостаточно, вы должны посмотреть код события. Вы можете отправить событие объекту A, содержащее указатель на объект B (который должен получить ответ), а затем в функции customEvent() объекта A, создать событие для ответа и отправить его объекту B. Функция cusotmEvent() всегда запускаться в потоке, которому принадлежит данный объект, поэтому вы можете безопасно взаимодействовать с Qt-предоставленным кодом столько, сколько хотите в этот момент. Проводка событий другому объекту также специально указана как поточно-безопасная, независимо от того, принадлежит ли она к потоку принимающего объекта.

3

Ну, я не могу согласиться. Qt четко говорит, что вы не можете получить доступ к gui из другого потока, кроме основного. Есть два способа добиться того, что вам нужно.

  1. сделать Qt :: QueuedConnection между резьбой и главным окном то есть основной слот окна updateProgressBar(int), потоком сигналом updateProgressBar(int). вы подключаетесь таким образом: connect(workerThread, SIGNAL(updateProgressBar(int)), mainWindow, SLOT(updateProgressBar(int)), Qt::QueuedConnection) Вы также можете подключить свои сигналы рабочего потока непосредственно к виджетам, которые вы хотите обновить.
  2. Определите свои собственные события (ваше собственное значение типа события должно быть >= QEvent::User и <= QEvent::MaxUser), переопределите customEvent в главном окне и правильно обработайте эти события. Передайте события в главное окно (вам нужно указать указатель на объект основного окна) на QCoreApplication::postEvent(mainWindow, yourCustomEvent)
Смежные вопросы