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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обмен данными между виджетами  (Прочитано 9327 раз)
klim
Гость
« : Ноябрь 16, 2008, 13:01 »

Вопрос, судя по всему, простецкий, но хорошего ответа так и не нашел.

Есть два виджета в окне программы. Один - редактор, другой - что-то вроде окна предварительного просмотра. Как правильно передать данные, скажем, из QLineEdit'ов 1-го виджета во второй?
Записан
Karl-Philipp
Гость
« Ответ #1 : Ноябрь 16, 2008, 14:34 »

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

Для этого сперва связываешь (с помощью connect()) сигнал нажатия кнопки и слот виджета "просмотр", а в слоте виджета "просмотр" уже вытягиваешь из виджета "редактор" нужные данные.

оно? Улыбающийся
« Последнее редактирование: Ноябрь 16, 2008, 14:35 от terlan » Записан
klim
Гость
« Ответ #2 : Ноябрь 16, 2008, 16:56 »

Оно. Только одно небольшое уточнение: про подачу сигнала о необходимости обновить данные я догадывался, гораздо мене понятен процесс "вытягивания" данных.
Как к тому виджету обратиться? Допустим в нём меня интересуют значения нескольких переменных. Создать новый экземпляр того виджета по понятным причинам - "не катит". Какой-то указатель на него нужно передавать или как?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Ноябрь 16, 2008, 19:07 »

через сигналы и слоты можно передавать параметры, если их много то можно передавать список.
Записан

Юра.
Hort
Гость
« Ответ #4 : Ноябрь 16, 2008, 21:53 »

вызов sender() в слоте возвращает указатель на виджет (или объект) который послал сигнал. из него то можно и выудить нужную тебе информацию
Записан
Karl-Philipp
Гость
« Ответ #5 : Ноябрь 16, 2008, 23:42 »

Оно. ...
Как к тому виджету обратиться?...
Если оба виджета у тебя являются отдельными классами и находятся в mainwindow, то что мешает сделать слот mainwindow (например slotSendViewerData()). Данный слот будет связан с сигналом нажатия некоторой кнопки.

В теле этого слота можно вызывать некоторый метод виджета "просмотр", куда в качестве параметра передавать указатель на "редактор". Извлечение данных "редактора" - с помощью (get()-методов).

Оно? Улыбающийся
« Последнее редактирование: Ноябрь 16, 2008, 23:47 от terlan » Записан
BRE
Гость
« Ответ #6 : Ноябрь 16, 2008, 23:52 »

Код:
class MainWidget : ...
{
private:
EditWidget *m_edit;
PreviewWidget *m_preview;
};

MainWidget::MainWidget(...)
{
...
connect( m_edit, SIGNAL( update( const Data & ) ), m_preview, SLOT( update( const Data & ) ) );
...
}
В Data передаются все данные, которые были обнавлены. В preview эти данные обновляются.
Записан
SASA
Гость
« Ответ #7 : Ноябрь 17, 2008, 11:00 »

Если данные нужны много кому, то лучше выделить их в отдельный объект. Например, структуру или класс. Оба виджета хранят ссылку на данные. И по сигналу просто обновляются.
Записан
BRE
Гость
« Ответ #8 : Ноябрь 17, 2008, 11:19 »

Если данные нужны много кому, то лучше выделить их в отдельный объект. Например, структуру или класс. Оба виджета хранят ссылку на данные. И по сигналу просто обновляются.
В предыдущем посте так и сделано, класс Data.
Записан
SASA
Гость
« Ответ #9 : Ноябрь 17, 2008, 19:55 »

Если данные нужны много кому, то лучше выделить их в отдельный объект. Например, структуру или класс. Оба виджета хранят ссылку на данные. И по сигналу просто обновляются.
В предыдущем посте так и сделано, класс Data.
А зачем данные перекидывать? Один виджет данные редактирует, другой показывает, а данные сами по себе...
Записан
BRE
Гость
« Ответ #10 : Ноябрь 17, 2008, 20:07 »

Если данные нужны много кому, то лучше выделить их в отдельный объект. Например, структуру или класс. Оба виджета хранят ссылку на данные. И по сигналу просто обновляются.
В предыдущем посте так и сделано, класс Data.
А зачем данные перекидывать? Один виджет данные редактирует, другой показывает, а данные сами по себе...
А кто их перекидывает, вроде ссылки передаем.  Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #11 : Ноябрь 17, 2008, 20:18 »

вот вы тут спорите, а ведь товарищ klim не сказал, как должны взаимодействовать эти виджеты Улыбающийся
Записан
klim
Гость
« Ответ #12 : Ноябрь 17, 2008, 22:15 »

Чего-то у меня не очень получается через sender()  Злой

вот вы тут спорите, а ведь товарищ klim не сказал, как должны взаимодействовать эти виджеты Улыбающийся
Если совсем конкретно:
- есть виджет mainwindow, который несет в себе два виджета, унаследованные от qwidget (назовём их виджетами 2-го уровня)
- один из виджетов второго уровня (редактор) просто показывает всякие qlineedit'ы из ui-файла
- второй виджет второго уровня (просмотрщик) по некому событию должен залезть в данные виджета-редактора, и прямо из qlineedit'a получить значение, которое запишет в переменную (или сразу выведет на экран...)

Пробовал вот так:
Код:
void previewWidget::refresh()
{
    QObject *test = sender();
    QString str = test->имя_переменной_из_класса-редактора;
}
Компилятор говорит, что в классе нет переменной с таким именем.
Записан
spirit
Гость
« Ответ #13 : Ноябрь 17, 2008, 22:19 »

нужно сделать так
Код:
void previewWidget::refresh()
{
    MyObject *test = qobject_cast<MyObject *>(sender());
    QString str = test->имя_переменной_из_класса-редактора;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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