Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
6 / 6 / 2
Регистрация: 23.09.2012
Сообщений: 427
1

Как сделать connect() в Class2, если сигнал посылается из Class1?

21.11.2016, 11:37. Просмотров 921. Ответов 5
Метки нет (Все метки)

Вручную посылаю сигнал посредством emit из Class1. Как принять его, что написать в connect() в Class2, в котором и будет происходить дальнейшая его обработка? Будет очень хорошо, если покажете на примерах.
Извиняюсь за не очень грамотные формулировки, только недавно началось моё изучение Qt.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2016, 11:37
Ответы с готовыми решениями:

Сравнивание CLASS1* с CLASS2
есть вектор указателей CLASS1 и мне нужно функцией std::find найти нужный указатель делаю так:...

Может ли получить сигнал потомок от родителя, если сигнал: посылается всем (kill(0,SIGTERM) а потомок был добавлен в группу
Может ли получить сигнал потомок от родителя, если сигнал: посылается всем (kill(0,SIGTERM)) а...

List<class2> в объекте class1
Здравствуйте. Пытаюсь понять... Почему не могу создать экземпляр Figure, в конструкторе которого...

Запись CLASS1 *test = new CLASS2
https://www.cyberforum.ru/cpp-beginners/thread931696.html В продолжении этой темы, т.к. не могу в...

5
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
21.11.2016, 12:49 2
В коннект ты всегда(без частностей и сокращений) пишешь так:
connect(отправитель, его сигнал, приёмник, его слот[, тип коннекта]);

Сейчас вопрос в том, кто является связующим звеном между твоими двумя классами. Кто знает об обоих? Если у тебя внутри mainWindow создаются оба класса, значит о них знает mainWindow и именно в нем должен быть коннект.
C++ (Qt)
1
connect (&class1, SIGNAL(...), &class2, SLOT(...));
Если же у тебя, например, Class2 создается внутри класса Class1, то Class1 знает о них обоих (о себе и о своем содержимом). И значит коннект нужно внутри него(Class1) делать так:
C++ (Qt)
1
connect(&class2, SIGNAL(...), this, SLOT(...)); //предполагается, что обработка сигнала из класса2 будет проходить в слоте класса1
1
Эксперт С++
1931 / 1043 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
21.11.2016, 13:06 3
смотрите, давайте для начала с терминологией разберемся:
Класс - это грубо говоря описание некой структуры и поведения объекта (не материальная часть класса)
Объект класса - это грубо говоря "материальная" составляющая класса

сигнал - это какая-то информация, которая передаётся из "объект класса", зачастую используется просто для констатации факта некого "события", сигнал ничего не знает о том, кто будет его ловить, слушать и т.п. т.е. это грубо говоря (сигнальная ракета, ей пофиг, кто ее пустил и как, и еще больше пофиг, кто ее увидет, она просто даёт знать "о себе")
слот - это обработчик, который будет вызван в определенном (конкретном) объекте, на некое событие (сигнал) (в контексте сигнальной ракеты - это может быть прилет вертолета, сброс груза и т.п.).

Дальше механизм сигналов и слотов:
connect ("адрес объекта, который бросает сигнал", SIGNAL(сигнатура сигнала), "адрес объекта, который будет получать сигнал", SLOT/SIGNAL(сигнатура сигнала или слота), "метод вызова - не обязательный параметр").
соответственно, пример:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class SignalEmmiter
{
private:
  int someIntValue;
public:
   SignalEmmiter(int value): someIntValue(value) { }
   void emitSignal() { 
        qDebug() << "MyMegaCoolSignal almost sent. ID: " << someIntValue;
        emit myMegaCoolSignal(someIntValue); 
        qDebug() << "MyMegaCoolSignal was sent ID: " << someIntValue;
   }
signals: 
   void myMegaCoolSignal(int value);
}
 
class SignalReceiver
{
   QString m_name;
   public:
      SignalReceiver(QString name): m_name(name) { }
   public slots: 
     void OnMyMegaCoolSignalEmitted(int value) { qDebug() << "Mega Signal received[" << m_name << "], sender ID: " << value; }
}
 
 
void main()
{
    SignalEmmiter e1(1);
    SignalEmmiter e2(2);
    SignalEmmiter e3(3);
    SignalEmmiter e4(4);
 
   SignalReceiver r1("first");
   SignalReceiver r2("second");
   
   connect (&e1, SIGNAL(myMegaCoolSignal(int)), &r1, SLOT(OnMyMegaCoolSignalEmitted(int)));
   connect (&e2, SIGNAL(myMegaCoolSignal(int)), &r1, SLOT(OnMyMegaCoolSignalEmitted(int)));
   connect (&e3, SIGNAL(myMegaCoolSignal(int)), &r1, SLOT(OnMyMegaCoolSignalEmitted(int)));
   connect (&e4, SIGNAL(myMegaCoolSignal(int)), &r1, SLOT(OnMyMegaCoolSignalEmitted(int)));
 
   connect (&e2, SIGNAL(myMegaCoolSignal(int)), &r2, SLOT(OnMyMegaCoolSignalEmitted(int)));
   connect (&e4, SIGNAL(myMegaCoolSignal(int)), &r2, SLOT(OnMyMegaCoolSignalEmitted(int)));
 
 
   e1.emitSignal();
   e2.emitSignal();
   e3.emitSignal();
   e4.emitSignal();
}
1
6 / 6 / 2
Регистрация: 23.09.2012
Сообщений: 427
21.11.2016, 14:36  [ТС] 4
Спасибо большое.
А что делать, если слот должен выполнятся в каком-то, допустим, Class3? Можно как-то указать на этот класс-получатель без создания объекта?
0
6905 / 5970 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
21.11.2016, 14:37 5
Нет. Как создашь - связывай.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
21.11.2016, 14:44 6
Лучший ответ Сообщение было отмечено NoviiMir как решение

Решение

Метод connect() открытый и статический. Это значит, что его можно вызвать в любом месте кода. Главное чтоб объекты, к которым относится сигнал и слот были в области видимости. Если класс, в котором вызываешь метод connect(), не является наследником QObject или вызываешь из функции, которая вообще не входит ни в какой класс, тогда вызываешь так : QObject::connect(....)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2016, 14:44

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

Если сделать одинаковый connect() к слоту одного два раза, будет ли сигнал приходить дважды ?
Ну собственно если я делаю одинаковый коннект два раза и более, что происходит? 1. Последующие...

Результаты генерации случайных чисел методами Class1 и Class2 должны выводиться в RichTextBox в 2 столбца
На форме размещено текстовые боксы: &quot;имя файла&quot;, &quot;К - количество элементов массива&quot;, &quot;Максимальный...

Как из List<Class1> удалить всех потомков Class1?
У меня есть List&lt;Class1&gt;, который хранит в себе и потомков класса Class1, как мне удалить этих...

Авторизация проходит успешно, но сигнал не посылается
QObject::connect: No such signal QWebView::urlChanged(bool) QObject::connect: (sender name: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.