Russian Qt Forum

Qt => Общие вопросы => Тема начата: klim от Ноябрь 16, 2008, 13:01



Название: Обмен данными между виджетами
Отправлено: klim от Ноябрь 16, 2008, 13:01
Вопрос, судя по всему, простецкий, но хорошего ответа так и не нашел.

Есть два виджета в окне программы. Один - редактор, другой - что-то вроде окна предварительного просмотра. Как правильно передать данные, скажем, из QLineEdit'ов 1-го виджета во второй?


Название: Re: Обмен данными между виджетами
Отправлено: Karl-Philipp от Ноябрь 16, 2008, 14:34
Допуситим, что при наступлении некоторого события (нажатия "кнопки предварительного просмотра", например) данные должны передаваться из одного виджета в другой.

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

оно? :)


Название: Re: Обмен данными между виджетами
Отправлено: klim от Ноябрь 16, 2008, 16:56
Оно. Только одно небольшое уточнение: про подачу сигнала о необходимости обновить данные я догадывался, гораздо мене понятен процесс "вытягивания" данных.
Как к тому виджету обратиться? Допустим в нём меня интересуют значения нескольких переменных. Создать новый экземпляр того виджета по понятным причинам - "не катит". Какой-то указатель на него нужно передавать или как?


Название: Re: Обмен данными между виджетами
Отправлено: lit-uriy от Ноябрь 16, 2008, 19:07
через сигналы и слоты можно передавать параметры, если их много то можно передавать список.


Название: Re: Обмен данными между виджетами
Отправлено: Hort от Ноябрь 16, 2008, 21:53
вызов sender() в слоте возвращает указатель на виджет (или объект) который послал сигнал. из него то можно и выудить нужную тебе информацию


Название: Re: Обмен данными между виджетами
Отправлено: Karl-Philipp от Ноябрь 16, 2008, 23:42
Оно. ...
Как к тому виджету обратиться?...
Если оба виджета у тебя являются отдельными классами и находятся в mainwindow, то что мешает сделать слот mainwindow (например slotSendViewerData()). Данный слот будет связан с сигналом нажатия некоторой кнопки.

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

Оно? :)


Название: Re: Обмен данными между виджетами
Отправлено: BRE от Ноябрь 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 эти данные обновляются.


Название: Re: Обмен данными между виджетами
Отправлено: SASA от Ноябрь 17, 2008, 11:00
Если данные нужны много кому, то лучше выделить их в отдельный объект. Например, структуру или класс. Оба виджета хранят ссылку на данные. И по сигналу просто обновляются.


Название: Re: Обмен данными между виджетами
Отправлено: BRE от Ноябрь 17, 2008, 11:19
Если данные нужны много кому, то лучше выделить их в отдельный объект. Например, структуру или класс. Оба виджета хранят ссылку на данные. И по сигналу просто обновляются.
В предыдущем посте так и сделано, класс Data.


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


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


Название: Re: Обмен данными между виджетами
Отправлено: Karl-Philipp от Ноябрь 17, 2008, 20:18
вот вы тут спорите, а ведь товарищ klim не сказал, как должны взаимодействовать эти виджеты :)


Название: Re: Обмен данными между виджетами
Отправлено: klim от Ноябрь 17, 2008, 22:15
Чего-то у меня не очень получается через sender()  >:(

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

Пробовал вот так:
Код:
void previewWidget::refresh()
{
    QObject *test = sender();
    QString str = test->имя_переменной_из_класса-редактора;
}
Компилятор говорит, что в классе нет переменной с таким именем.


Название: Re: Обмен данными между виджетами
Отправлено: spirit от Ноябрь 17, 2008, 22:19
нужно сделать так
Код:
void previewWidget::refresh()
{
    MyObject *test = qobject_cast<MyObject *>(sender());
    QString str = test->имя_переменной_из_класса-редактора;
}