0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 2
1

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?

01.11.2018, 21:11. Показов 5887. Ответов 4
Метки нет (Все метки)

Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса. Буду очень признателен, если покажете и вариант конекта с новым синтаксисом

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
   int var;
   signals:
     void A_signal(int var);   
 }
 
 class B {
   A * a;
   public slots:
    void  on_A_signal(int);
 }
 
 void B::on_A_signal(int err) {...}
 
 void B::myFunc()
 {
     connect(вот тут надо сигнал из А привязать к слоту on_A_signal);
 }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2018, 21:11
Ответы с готовыми решениями:

Использование в качестве поля класса указатель на объект другого класса
Ошибка в названии - "указателЯ" Вот, пытаюсь освоить ООП (пока только учусь): создаю класс...

Статический указатель класса на объект этого же класса
Не пойму: что в этом коде не так? #include <iostream> #include <cstdlib> using namespace std;...

Передача конструктору одного класса объект другого класса
Здравствуйте, кодеры. Столкнулся с проблемой. У меня есть 2 класса Camera и Game и...

Как соединить сигнал класса MainWindow openFile c слотом класса MainController openFile?
класс главного окна class MainWindow : public QMainWindow { Q_OBJECT public: ...

4
222 / 188 / 96
Регистрация: 15.04.2018
Сообщений: 702
01.11.2018, 21:35 2
У вас должны быть экземпляры каждого из классов "под рукой". Далее передаем
"От кого" "какой сигнал" "кому" "какой слот"

C++ (Qt)
1
2
3
4
5
6
void otherFunc()
{
    A *a = new A();
    B *b = new B();
    connect(a, SIGNAL(A_signal(int)), b, SLOT(on_A_signal(int));
}
Не забудьте в cpp файле описать on_A_signal(int)

Далее вам просто нужно вызвать сигнал у класса A
emit a.A_signal(3); //не уверен в правильности

p.s. не отлаживал код, могут быть косяки
0
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 2
01.11.2018, 22:27  [ТС] 3
Я так понимаю, без создания объектов в этом случае никак?

Добавлено через 22 минуты
Если без объявления экземпляров такое напишу, будет ли оно работать?
C++ (Qt)
1
2
3
4
void B::myFunc()
{
    connect(this,  SIGNAL(a->A_signal(int)),   this, SLOT(on_A_signal(int)) );
}
0
7159 / 6134 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
01.11.2018, 23:34 4
Ясно, что не будет.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
02.11.2018, 14:43 5
Лучший ответ Сообщение было отмечено olmios как решение

Решение

По-хорошему:
Если объект класса В содержит в себе указатель на объект класса А и коннект создается в классе В, то его слот on_A_signal можно сделать приватным.
Неважно, где создается и как передается объект класса А в класс В (через конструктор В, функцию инициализации класса В или где-то внутри класса В). Важно, чтобы коннект создавался рядом при получении валидного объекта. Разносить сохранение указателя на объект и логику взаимодействия с ним, имхо, плохо.

C++ (Qt)
1
2
3
4
5
void B::createA()
{
    a = new A();
    QObject::connect(...); // коннектим сразу, как создали
}
или
C++ (Qt)
1
2
3
4
5
void B::addA(A* outsideA)
{
    a = outsideA;
    QObject::connect(...); // коннектим сразу, как получили
}
Ну и формы коннекта применительно к этому случаю:
C++ (Qt)
1
2
QObject::connect(a, SIGNAL(A_signal(int)), this, SLOT(on_A_signal(int))); // старый стиль - плох тем, что невозможно увидеть ошибку на этапе компиляции. Только на этапе выполнения. 
QObject::connect(a, &A::A_signal, this, &B::on_A_signal); // лучший вариант. Но иногда невозможно написать такой коннект, если в классах есть перегруженные сигналы и слоты
1
02.11.2018, 14:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2018, 14:43

Создание статической функции класса, которая принимает экземпляр этого же класса как объект
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize);...

Можно ли как-то получить из одного класса исходный код другого класса?
Предположим есть два публичных класса. Один находится в одной части проекта, другой где-нибудь в...

Как переместить из стека одного класса в массив другого класса?
// HW_on.24.11_classStack_SantaClaus.cpp: определяет точку входа для консольного приложения. //...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru