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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса  (Прочитано 2887 раз)
BulSV
Гость
« : Август 15, 2012, 16:35 »

Доброго времени суток. У меня вопрос:

Код:
class A: public QObject
{
  Q_OBJECT
  ........
  signals:
    void a();
  ........
};

class B: public QObject
{
  Q_OBJECT
  A *aB;
  ........
  public slots:
    void onAB();
  ........
};

B::B(QObject *parent)
  : QObject(parent)
  , aB(new A(this))
{
  ........
  connect(aB, SIGNAL(a()), this, SLOT(onAB()));
  ........
}

class C: public QObject
{
  Q_OBJECT
  A *aC;
  ........
  public slots:
    void onAC();
  ........
};

C::C(QObject *parent)
  : QObject(parent)
  , aC(new A(this))
{
  ........
  connect(aC, SIGNAL(a()), this, SLOT(onAC()));
  ........
}

Как сделать, чтобы слот onAB() вызывался ТОЛЬКО на сигнал объекта aB, но не на сигнал объекта aC, и наоборот.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Август 15, 2012, 16:39 »

Он и так будет вызываться только от объекта aB.
Записан
BulSV
Гость
« Ответ #2 : Август 15, 2012, 16:48 »

У меня почему-то он запускает два слота В замешательстве
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Август 15, 2012, 17:06 »

У меня почему-то он запускает два слота В замешательстве

Минимальный рабочий код покажи, можно в одном main.cpp
Записан
BulSV
Гость
« Ответ #4 : Август 18, 2012, 23:29 »

У меня почему-то он запускает два слота В замешательстве

Минимальный рабочий код покажи, можно в одном main.cpp

Проверил на коде - всё правильно. Запускает только от объекта aB. В моём случае, различие только в файле main.cpp.
Код, на всякий случай:

testSignals.pro
Код:
QT       += core

QT       -= gui

TARGET = testSignals
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp \
    a.cpp \
    b.cpp \
    c.cpp

HEADERS += \
    a.h \
    b.h \
    c.h

a.h
Код:
#ifndef A_H
#define A_H

#include <QObject>
#include <QTimer>

class A : public QObject
{
    Q_OBJECT
    QTimer *time;
public:
    explicit A(QObject *parent = 0);
   
signals:
    void a();
public slots:
    void aA();
   
};

#endif // A_H

a.cpp
Код:
#include "a.h"
#include <QDebug>

A::A(QObject *parent)
    : QObject(parent)
    , time(new QTimer(this))
{   
    time->setInterval(22500);
    time->start();

    connect(time, SIGNAL(timeout()), this, SLOT(aA()));
    connect(time, SIGNAL(timeout()), this, SIGNAL(a()));
}


void A::aA()
{
    qDebug() << "void A::aA(): signal is emited";
}

b.h
Код:
#ifndef B_H
#define B_H

#include <QObject>
#include "a.h"
#include <QTimer>

class B : public QObject
{
    Q_OBJECT
    A *aB;
    QTimer *time;
public:
    explicit B(QObject *parent = 0);
   
signals:
   
public slots:
    void onAB();
};

#endif // B_H

b.cpp
Код:
#include "b.h"
#include <QDebug>

B::B(QObject *parent)
    : QObject(parent)
    , aB(new A(this))
    , time(new QTimer(this))
{
    aB->setObjectName("aB");
    time->setInterval(5000);
    time->start();
    connect(aB, SIGNAL(a()), this, SLOT(onAB()));
    connect(time, SIGNAL(timeout()), this, SLOT(onAB()));
}

void B::onAB()
{
    qDebug() << "B::onAB()" << QObject::sender();
}

c.h
Код:
#ifndef C_H
#define C_H

#include <QObject>
#include "a.h"

class C : public QObject
{
    Q_OBJECT
    A *aC;
public:
    explicit C(QObject *parent = 0);
   
signals:
   
public slots:
    void onAC();
};

#endif // C_H

c.cpp
Код:
#include "c.h"
#include "a.h"
#include <QDebug>

C::C(QObject *parent) :
    QObject(parent)
  , aC(new A(this))
{
    aC->setObjectName("aC");
    connect(aC, SIGNAL(a()), this, SLOT(onAC()));
}

void C::onAC()
{
  qDebug() << "C::onAC()" << QObject::sender();
}

main.cpp
Код:
#include <QCoreApplication>
#include "b.h"
#include "c.h"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    B b;
    C c;

    return app.exec();
}

main.cpp - в моём случае
Код:
#include <QCoreApplication>
#include "b.h"
#include "c.h"
#include "a.h"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    A a;
    B b;
    C c;

    QObject::connect(&a, SIGNAL(a()), &b, SLOT(onAB()));
    QObject::connect(&a, SIGNAL(a()), &c, SLOT(onAC()));

    return app.exec();
}

Вывод для 1-го случая:
Код:
B::onAB() QTimer(0x135a230) 
B::onAB() QTimer(0x135a230)
B::onAB() QTimer(0x135a230)
B::onAB() QTimer(0x135a230)
void A::aA(): signal is emited
B::onAB() A(0x134fd30, name = "aB")
void A::aA(): signal is emited
C::onAC() A(0x1362920, name = "aC")
B::onAB() QTimer(0x135a230)

Вывод для 2-го случая (моего):
Код:
B::onAB() QTimer(0x14f5930) 
B::onAB() QTimer(0x14f5930)
B::onAB() QTimer(0x14f5930)
B::onAB() QTimer(0x14f5930)
void A::aA(): signal is emited
B::onAB() A(0x7fffb337bf20)
C::onAC() A(0x7fffb337bf20)
void A::aA(): signal is emited
B::onAB() A(0x14ed1d0, name = "aB")
void A::aA(): signal is emited
C::onAC() A(0x14f5df0, name = "aC")
B::onAB() QTimer(0x14f5930)
Записан
andrew.k
Гость
« Ответ #5 : Август 19, 2012, 14:27 »

У меня почему-то он запускает два слота В замешательстве

Минимальный рабочий код покажи, можно в одном main.cpp

Проверил на коде - всё правильно. Запускает только от объекта aB. В моём случае, различие только в файле main.cpp.
Код, на всякий случай:

Смотри.
Ты выложил свои исходники в виде гигантского сообщения. Ты потратил кучу времени, чтобы оформить его "красиво".
Но просматривать исходники в таком виде чрезвычайно неудобно.
А если захочется собрать под креатором, так это ж вообще замучаешься копировать.
А если бы ты выложил исходники просто архивом, то сэкономил бы и свое, и чужое время, и возможно даже уже кто-то бы тебе помог.
Исправляйся  Подмигивающий
Записан
BulSV
Гость
« Ответ #6 : Август 20, 2012, 00:07 »

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

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

Тему можно закрывать Подмигивающий
« Последнее редактирование: Август 29, 2012, 15:11 от BulSV » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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