Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Stek от Июль 27, 2012, 14:37



Название: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 27, 2012, 14:37
Здравствуйте!

Собственно вопрос в названии темы: как связать виджеты расположенные на разных формах? Тема поднималась и не раз, но увы я так и не понял как же это всё-таки сделать  :(

Есть 2 формы, на одной из них treeWidget, на другой comboBox с списком значений. По нажатии кнопки выбранное значение из comboBox должно присваиваться текущему пункту treeWidget

ui->treeWidget->currentItem()->setText(0,ui->comboBox->currentText());

как такое осуществить из разных форм


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 27, 2012, 14:43
связать формы через сигнал-слот, например


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 27, 2012, 14:52
связать формы через сигнал-слот, например

Спасибо конечно, но можно поподробнее. Про сигналы, слоты читал и имею представление. Но хотелось бы небольшой пример в к-ом увязываются между собой виджеты разных форм, если это не очень сложно и это раздел для новичков начинающих своё знакомство с qt. Думаю в таком случае одинаковых тем на форуме станет на одну меньше.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 27, 2012, 14:56
Создаешь у первой формы сигнал needToChangeText(QString) и при нажатии на кнопку делаешь его emit со значением ui->comboBox->currentText()

Во второй форме делаешь слот changeText(QString), в котором выполняешь ui->treeWidget->currentItem()->setText(параметр слота)

Привязываешь сигнал к слоту


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 27, 2012, 15:39
Не понимаю  :'(, точнее понимаю о чём речь, но как организуется взаимосвязь не пойму.
Создам я слоты у обеих форм, но как их увязать между собой, чтобы виджет одной формы обратился к виджету другой.
Был пост с подобной темой http://www.prog.org.ru/topic_16396_0.html (http://www.prog.org.ru/topic_16396_0.html), там говорилось о qobject_cast. Не могли бы привести фрагмент кода для таких как я непонимающих.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 27, 2012, 15:41
Ты, похоже, невнимательно читаешь. Я не говорил про слоты у обеих форм, я говорил про сигнал у одной формы и слот у другой. Связываются они через connect, что должны делать я описал. Что конкретно тебе непонятно?


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 27, 2012, 15:49
Читать стараюсь внимательно, но не понимаю если можно так выразиться.. результирующей составляющей. Можно повториться, неясно как я связываю виджеты разных форм, ключевой связующий "элемент" мне не понятен. Реализовать предложенный вами вариант у меня не получилось. Ткните носом в тему, мануал, пример из qt с решением подобного вопроса..


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 27, 2012, 16:04
Ткнуть носом в пример реализации сигнала и слота? Первая форма высылает сигнал со значением, которое вторая форма в слоте вставляет в нужный виджет. Все рады, счастливы, поют песни. Выкладывай код, в котором у тебя не получилось реализовать


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Bepec от Июль 27, 2012, 17:08
http://qt-project.org/doc/qt-4.8/signalsandslots.html#signals-and-slots


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 10:56
Добрый день!
Не могли бы вы всё-таки привести пример кода, если не затруднит. ???


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 30, 2012, 11:00
Пример кода сигналов и слотов?
Ты будешь показывать что у тебя не получилось?


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Bepec от Июль 30, 2012, 12:00
http://qt-project.org/doc/qt-4.8/signalsandslots.html#signals-and-slots


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 12:22
http://qt-project.org/doc/qt-4.8/signalsandslots.html#signals-and-slots

При всём моём уважении и вашем статусе с внушительным кол-вом постов, ну наверное более объёмных и содержательных и не связанных с раздачей ссылок и указании направления на QtSDK/examples... был бы более благодарен за пример, реализующий указанную задачу.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Igors от Июль 30, 2012, 12:32
При всём моём уважении и вашем статусе с внушительным кол-вом постов, ну наверное более объёмных и содержательных и не связанных с раздачей ссылок и указании направления на QtSDK/examples... был бы более благодарен за пример, реализующий указанную задачу.
Нет ничего плохого в "дайте списать" (суть Вашего поста), если человек вежливый. Но в данном случае как Вы себе это представляете? Кто-то должен набросать скелетик приложения, придумать какие-то формы, заполнить их чем-то - не многовато ли только чтобы "показать пример"? Выложите проект и скажите что с чем хотите связать - и поверьте, свяжут очень быстро  :)


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 12:46
Пример кода сигналов и слотов?
Ты будешь показывать что у тебя не получилось?
Bkb
Когда вообщем-то не понятна реализация написать что-то внятное довольно трудно, можно написать бред и количество постов в ветке станет больше. void needToChangeText(QString) я пишу для form1, pushButton расположен на form2.ui по нажатии на него я должен вызвать emit needToChangeText(QString) ..
Можно на примере показать что к чему, чтобы было понятно (и не только мне)? Или же, как обычно бывает: Вам всё выше написали, а вы просто не хотите читать и разбираться. Мне непонятно как виджет формы1 сможет получить данные виджета формы2. Я понимаю что можно использовать сигнал-слот (собственно вопрос как?). Я  только начал изучать qt. В контексте моей задачи я не знаю как увязать слот-сигнал.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 12:52
При всём моём уважении и вашем статусе с внушительным кол-вом постов, ну наверное более объёмных и содержательных и не связанных с раздачей ссылок и указании направления на QtSDK/examples... был бы более благодарен за пример, реализующий указанную задачу.
Нет ничего плохого в "дайте списать" (суть Вашего поста), если человек вежливый. Но в данном случае как Вы себе это представляете? Кто-то должен набросать скелетик приложения, придумать какие-то формы, заполнить их чем-то - не многовато ли только чтобы "показать пример"? Выложите проект и скажите что с чем хотите связать - и поверьте, свяжут очень быстро  :)
Проект это громко сказано, а ключевую задачу я бъяснил подробно в самом первом посте, могу повторить конечно. С ответом на вопрос мне постарались помочь, за что большое спасибо. Вопрос как я понимаю относится к разряду простых. Но я не разобрался. Хорошо когда достигаешь какого-то уровня, но в то же время не забываешь что и сам когда-то был новичком.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Bepec от Июль 30, 2012, 12:54
Stek, прекратите тормозить.

Почитайте ссылку, которую я дал.
Вы понимаете что надо сделать. Вы не понимаете как связать данные?

connect(*объект1, SIGNAL(сигнал1(параметры сигнала)), *объект2, SLOT(слот2(параметры слота)));

Вот это связывание. Теперь при испускании сигнала объектом1, будет вызываться слот2 у объекта2. Данные в параметрах.

PS и не тормозите, повторюсь - вам народ помочь хочет, просит выкинуть вас проект. Выкиньте.

PPS у меня много весёлых и содержательных постов, не связанных с раздачей ссылок и указаний направления на QtSDK/example. Но в вашем случае - ТОЛЬКо QtSDK/example. Там в каждом примере по 7-8 примеров сигнал-слотовой архитектуры.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 30, 2012, 13:01
На форме Form1 есть поле ввода и кнопка. По нажатию на кнопку происходит:
Код
C++ (Qt)
void Form1::on_pushButton_clicked()
{
   emit needToChangeText(ui->lineEdit->text());
}
 

На форме Form2 есть QLabel. У формы имеется слот с таким кодом:
Код
C++ (Qt)
void Form2::changeText(QString text)
{
   ui->label->setText(text);
}
 

В main.cpp создаются две формы и связываются:
Код
C++ (Qt)
#include <QtGui/QApplication>
#include "Form1.h"
#include "Form2.h"
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   Form1 f1;
   Form2 f2;
 
   QObject::connect(&f1, SIGNAL(needToChangeText(QString)), &f2, SLOT(changeText(QString)));
   f1.show();
   f2.show();
 
   return a.exec();
}
 

Теперь при нажатии кнопки в первой форме тест из ее поля ввода появляется во второй форме. Вот самый грубый пример


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 14:39
Спасибо mutineer, но видимо что-то я не  учёл, пишет No such signal MainWindow::needToChangeText(QString)...
Прикрепил файл с проектом.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Serr500 от Июль 30, 2012, 14:51
Вы бы почитали книжку какую-нибудь что-ли о том как работать с сигналами и слотами.
Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT
    // . . .
    signals :
        void needToChangeText(QString text);
}
Реализации сигналов в .cpp быть не должно.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Bepec от Июль 30, 2012, 14:52
пиндец...

Читай млиать статью по моей ссылке. У тебя же сигнал ни один не объявлен. Одни слоты.

private slots: - СЛОТЫ.
signals: - сигналы.

У сигнала нет и не будет никогда тела функции.
Т.е. он тупо объявлен. И отправляется emit сигнал(параметры).

Мдя :D

PS АРРРР, жара на меня плохо действует!!! КРОВИ КРОВИ!!!


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 15:16
Ура! Получилось. Спасибо большое mutineer, Serr500. Почитать материал мне стоит и много, хотя материал без практики как в моём случае стоит немногого.

P/S Верес, Видимо мой пост в Ваш адрес всё же был близок к истине, раз столько внимания и эмоций в виде отдельных эпитетов в мою сторону. Ответных слов не будет, я только начал своё знакомство QT, плохо что те кто достигает какого-либо уровня забывает себя в начале пути.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: mutineer от Июль 30, 2012, 15:18
P/S Видимо мой пост в Ваш адрес всё же был близок к истине, раз столько внимания и эмоций в виде отдельных эпитетов в мою сторону. Ответных слов не будет, я только начал своё знакомство QT, плохо что те кто достигает какого-либо уровня забывает себя в начале пути.

А еще хуже, что многие новички считают недостойным себя читать документацию. Это грустно...


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Bepec от Июль 30, 2012, 15:19
mutineer +1.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Igors от Июль 30, 2012, 15:36
Почитать материал мне стоит и много, хотя материал без практики как в моём случае стоит немногого.

P/S Верес, Видимо мой пост в Ваш адрес всё же был близок к истине, раз столько внимания и эмоций в виде отдельных эпитетов в мою сторону. Ответных слов не будет, я только начал своё знакомство QT, плохо что те кто достигает какого-либо уровня забывает себя в начале пути.
Проект был выложен в 2:39 а в 2:51 (спустя 12 минут) был дан ответ который помог Вам решить проблему. Так что Вы бы ото не патякали и не препирались на 2 листах а положили бы сразу проект. Цените свое и чужое время.


Название: Re: Связь виджетов расположенных на разных формах
Отправлено: Stek от Июль 30, 2012, 17:09
Закончилось всё тем же, что и на любом форуме с любой тематикой - победили "Бывалые".
Даже не знаю с кем соглашаться, кому что противопоставить...ну опять же я не в "ранге".

Спасибо всем за помощь!