Has-отношения и сигналы в Qt - PullRequest
1 голос
/ 03 ноября 2011

Я новичок в разработке с Qt, и наш дизайн использует отношения has-a в нескольких местах. В некоторых из этих случаев контейнер должен выставлять сигнал внутреннего объекта, и тогда я в настоящее время записываю частный слот для каждого такого сигнала, где я на практике повторно излучаю сигнал снова. Есть ли в Qt какой-нибудь ярлык, помогающий раскрыть сигнал внутреннего объекта на контейнере?

Ответы [ 4 ]

5 голосов
/ 03 ноября 2011

Из документации :

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

Допустимо следующее:

connect(sender, SIGNAL(originalSignal()), SIGNAL(newSignal()));
5 голосов
/ 03 ноября 2011

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

Итак, в вашем контейнере у вас будет что-то вроде этого

connect(object, SIGNAL(signal1()), this, SIGNAL(signal1()));

Конечно, вы должны переопределить сигнал на вашем контейнере.

Для получения более подробной информации см. Документацию к слоту сигнала

0 голосов
/ 01 января 2015

Переиздание сигналов также позволяет переизлучать несколько сигналов.

testclass.h:

#include <QObject>
#include <QDebug>

class TestClass : public QObject
{
Q_OBJECT
public:
    explicit TestClass(QObject *parent = 0)
    {
        connect(this, SIGNAL(signal1()), this, SIGNAL(signal2()));
        connect(this, SIGNAL(signal1()), this, SIGNAL(signal2()));
        connect(this, SIGNAL(signal2()), this, SLOT(slot()));
    }
    void emitSignal1()
    {
        emit signal1();
    }

signals:
    void signal1();
    void signal2();

public slots:
    void slot()
    {
        qDebug() << "SLOT HAS BEEN CALLED";
    }
};

main.cpp:

#include <QCoreApplication>
#include "testclass.h"

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

    TestClass instance;

    instance.emitSignal1();

    return a.exec();
}

В результате слот вызывается дважды.

0 голосов
/ 04 ноября 2011

Если это внутренняя структура вашего класса, почему вы не сделаете это своим другом? Тогда вы можете внутри вашей внутренней структуры звонить напрямую emit parentObj->signal()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...