Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Firefox от Июль 15, 2011, 09:59



Название: как обратиться к элементам формы из подключаемого класса
Отправлено: Firefox от Июль 15, 2011, 09:59
Здравствуйте. мне надо обращаться к элементам формы из подключаемого класса. он наследуется от QThread. форму в дизайнере создавала. если можно объясните поподробнее, чтоб даже до ежа дошло :)


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Пантер от Июль 15, 2011, 10:18
Из потока это нельзя. Только сигналы/слоты.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Firefox от Июль 16, 2011, 01:29
ну я вот подключила класс формы к классу, потом на него указатель ввела public и через указатель обращаюсь. компилируется все нормально, но при первом же обращении к элементу формы программа падает. я так поняла что что-то с областями видимости.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Etud от Июль 16, 2011, 17:41
Вот посоветовали ей, а она все равно упрямая!  ;D

Читай выше еще раз.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Странник от Июль 17, 2011, 15:55
если немного подробнее, то нельзя напрямую обращаться к gui из другого потока. межпотоковое взаимодействие можно организовать с помощью сигналов и слотов. наследник qthread высылает сигналы, сообщая об изменении своего состояния. эти сигналы соединяются со слотами формы, в которых реализуется реакция, в режиме QueuedConnection - это позволяет слоту выполняться в потоке принимающего объекта. на эту тему много примеров, не ленитесь.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Гурман от Июль 17, 2011, 19:11
а если еще точнее, то к любым элементам GUI можно напрямую обращаться только из главного потока, в котором работает QApplication

http://doc.qt.nokia.com/latest/threads-starting.html (http://doc.qt.nokia.com/latest/threads-starting.html)

Цитировать
In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations.

из остальных потоков нельзя обращаться через сигнал-слот соединения типа Qt::DirectConnection, через остальные можно


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Igors от Июль 17, 2011, 19:32
Было бы неплохо уточнить/расшифровать что то за "обращаться". Пример
Код
C++ (Qt)
QLineEdit * edit = new QLineEdit();  // создан в главной нитке
..
QString txt  = theMainWindow->edit->text();   // из др. нитки
 
Это "обращаться" или как? Если да то неясно чем это некорректно: метод const, UI я никак не трогаю


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Гурман от Июль 17, 2011, 20:41
Цитировать
Было бы неплохо уточнить/расшифровать что то за "обращаться".

похоже, нельзя делать ничего, что может привести к вызову paintEvent(), но глубже не копал


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Странник от Июль 18, 2011, 09:56
Это "обращаться" или как? Если да то неясно чем это некорректно: метод const, UI я никак не трогаю
без синхронизации - некошерно, с синхронизацией - неудобно. теоретически, значение свойства может измениться в GUI-потоке во время выполнения const-метода. поправьте, если ошибаюсь.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Пантер от Июль 18, 2011, 09:58
Константность метода еще не показатель того, что он ничего не изменяет.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: LisandreL от Июль 18, 2011, 10:32
UI я никак не трогаю
Ну, если опустить тот момент, что edit не должен удаляться, то благодаря тому, что QString «Implicitly Shared Class» то она в вашем примере не побъётся при копировании, даже если в основном потоке в этот момент строка изменится.
Но всё равно я бы не рекомендовал так делать, тем более что копирование вовсе не всех типов атомарно на всех системах.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Igors от Июль 18, 2011, 12:39
...благодаря тому, что QString «Implicitly Shared Class» то она в вашем примере не побъётся при копировании, даже если в основном потоке в этот момент строка изменится.
Думается что все же побьется
Цитата: cpp
QString s1("abc");
QString s2 = s1;
Пока s1 и s2 шерят одни данные ("abc"). Я могу изменить напр s1 из одной нитки - а s2 из другой, все Ok благодаря Implicitl Shared. Но это не спасет если одна нитка читает s1 а другая пишет тот же s1.


Название: Re: как обратиться к элементам формы из подключаемого класса
Отправлено: Гурман от Июль 18, 2011, 12:50
насколько я понял, хотя опять же, подробно не разбирался - не допускается именно рисование в параллельных нитях, поскольку для скорости отрисовки они пожертвовали синхронизацией, а без нее невозможно правильно отрисовать перекрывающиеся и parent/child элементы, и дело вовсе не в доступе к строками и "побьется-не побьется", это как раз, элементарно можно было бы внутри синхронизировать