Russian Qt Forum

Qt => Вопросы новичков => Тема начата: BulSV от Август 15, 2012, 16:35



Название: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса
Отправлено: 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, и наоборот.


Название: Re: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса
Отправлено: Alex Custov от Август 15, 2012, 16:39
Он и так будет вызываться только от объекта aB.


Название: Re: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса
Отправлено: BulSV от Август 15, 2012, 16:48
У меня почему-то он запускает два слота :-\


Название: Re: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса
Отправлено: Alex Custov от Август 15, 2012, 17:06
У меня почему-то он запускает два слота :-\

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


Название: Re: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса
Отправлено: BulSV от Август 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)


Название: Re: Слоты 2х объектов разных классов срабатывают на сигналы 2х объектов 3го класса
Отправлено: andrew.k от Август 19, 2012, 14:27
У меня почему-то он запускает два слота :-\

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

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

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


Название: Re: Слоты 2х объектов разных классов срабатыв
Отправлено: BulSV от Август 20, 2012, 00:07
Смотри.
Ты выложил свои исходники в виде гигантского сообщения. Ты потратил кучу времени, чтобы оформить его "красиво".
Но просматривать исходники в таком виде чрезвычайно неудобно.
А если захочется собрать под креатором, так это ж вообще замучаешься копировать.
А если бы ты выложил исходники просто архивом, то сэкономил бы и свое, и чужое время, и возможно даже уже кто-то бы тебе помог.
Исправляйся  ;)

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

Тему можно закрывать ;)