Russian Qt Forum
Сентябрь 21, 2024, 22:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как обратиться к элементам формы из подключаемого класса  (Прочитано 9480 раз)
Firefox
Гость
« : Июль 15, 2011, 09:59 »

Здравствуйте. мне надо обращаться к элементам формы из подключаемого класса. он наследуется от QThread. форму в дизайнере создавала. если можно объясните поподробнее, чтоб даже до ежа дошло Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 15, 2011, 10:18 »

Из потока это нельзя. Только сигналы/слоты.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Firefox
Гость
« Ответ #2 : Июль 16, 2011, 01:29 »

ну я вот подключила класс формы к классу, потом на него указатель ввела public и через указатель обращаюсь. компилируется все нормально, но при первом же обращении к элементу формы программа падает. я так поняла что что-то с областями видимости.
Записан
Etud
Гость
« Ответ #3 : Июль 16, 2011, 17:41 »

Вот посоветовали ей, а она все равно упрямая!  Смеющийся

Читай выше еще раз.
Записан
Странник
Гость
« Ответ #4 : Июль 17, 2011, 15:55 »

если немного подробнее, то нельзя напрямую обращаться к gui из другого потока. межпотоковое взаимодействие можно организовать с помощью сигналов и слотов. наследник qthread высылает сигналы, сообщая об изменении своего состояния. эти сигналы соединяются со слотами формы, в которых реализуется реакция, в режиме QueuedConnection - это позволяет слоту выполняться в потоке принимающего объекта. на эту тему много примеров, не ленитесь.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Июль 17, 2011, 19:11 »

а если еще точнее, то к любым элементам GUI можно напрямую обращаться только из главного потока, в котором работает QApplication

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, через остальные можно
« Последнее редактирование: Июль 17, 2011, 19:19 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 17, 2011, 19:32 »

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Июль 17, 2011, 20:41 »

Цитировать
Было бы неплохо уточнить/расшифровать что то за "обращаться".

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

2^7-1 == 127, задумайтесь...
Странник
Гость
« Ответ #8 : Июль 18, 2011, 09:56 »

Это "обращаться" или как? Если да то неясно чем это некорректно: метод const, UI я никак не трогаю
без синхронизации - некошерно, с синхронизацией - неудобно. теоретически, значение свойства может измениться в GUI-потоке во время выполнения const-метода. поправьте, если ошибаюсь.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Июль 18, 2011, 09:58 »

Константность метода еще не показатель того, что он ничего не изменяет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Июль 18, 2011, 10:32 »

UI я никак не трогаю
Ну, если опустить тот момент, что edit не должен удаляться, то благодаря тому, что QString «Implicitly Shared Class» то она в вашем примере не побъётся при копировании, даже если в основном потоке в этот момент строка изменится.
Но всё равно я бы не рекомендовал так делать, тем более что копирование вовсе не всех типов атомарно на всех системах.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июль 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.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Июль 18, 2011, 12:50 »

насколько я понял, хотя опять же, подробно не разбирался - не допускается именно рисование в параллельных нитях, поскольку для скорости отрисовки они пожертвовали синхронизацией, а без нее невозможно правильно отрисовать перекрывающиеся и parent/child элементы, и дело вовсе не в доступе к строками и "побьется-не побьется", это как раз, элементарно можно было бы внутри синхронизировать
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 23.