qt - отправить сигнал между объектами в классе с разными родителями - PullRequest
0 голосов
/ 11 марта 2019

У меня есть класс (например, «контроллер»), и в этом классе я создал много объектов других классов с разными родителями.

Как отправить сигнал между этими классами и «контроллером» навызвать функцию в классе «controller»?

    #include "controller.h"


    Controller::Controller(QObject *parent) : QObject (parent){
        connect(sender(), SIGNAL(recivedCall(QString)), this, SLOT(alert(QString)));
    }

    void Controller::onCall(QJsonObject callinfo){
         nodes[callinfo["username"].toString()]= new PanelManager();
         nodes[callinfo["username"].toString()]->handleCallStateChanged(callinfo);
    }

    void Controller::alert(QString callinfo){
        qDebug()<<callinfo;
    }

Например, как отправить сигнал из «recivedCall» в каждом объекте «PanelManager» для вызова функции «alert» в классе «controller»?

1 Ответ

1 голос
/ 11 марта 2019

Объект, который создает ваши два компонента, должен установить связь между вашим сигналом и вашим слотом.Но вы не должны раскрывать внутренние компоненты (т.е. создавать getter для возврата указателя на атрибут).

Способ решения последней проблемы с Qt - создать сигнал в вашем родительском элементе и позволить ему транслироватьзвонки.Например, если мне нужно подключить QCheckBox к QLineEdit в двух разных виджетах:

class Parent1: public QWidget
{
    Q_OBJECT
public:
    Parent1(): QWidget(), myCheckBox(new QCheckBox("Edit", this))
    {
        connect(myCheckBox, &QCheckBox::clicked, this, &Parent1::editForbidden);
    }
private:
    QCheckBox* myCheckBox;
signals:
    void editForbidden(bool);
};


class Parent2: public QWidget
{
    Q_OBJECT
public:
    Parent2(): QWidget(), myLineEdit(new QLineEdit("Edit", this))
    {
        connect(this, &Parent2::forbidEdit, myLineEdit, &QLineEdit::setReadOnly);
    }
private:
    QLineEdit* myLineEdit;
signals:
    void forbidEdit(bool);
};


// In the parent of Parent1 and Parent2 (or in the main if there is no parent)
QObject::connect(p1, &Parent1::editForbidden, p2, &Parent2::forbidEdit);

В этом примере, когда я нажимаю на флажок в parent1, lineEdit в parent2 отключается,Но Parent1 ничего не знает о Parent2.

...