qt-在具有不同父级的类中的对象之间发送信号

时间:2019-03-11 06:19:58

标签: c++ qt qt5 signals-slots

我有一堂课(例如“控制器”) 在这个课程中,我创建了许多其他课程的对象  与不同的父母。

如何在该类与“控制器”之间发送信号以调用“控制器”类中的函数?

    #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;
    }

例如,如何从每个“ PanelManager”对象中的“ recivedCall”发送信号以调用“ controller”类中的“ alert”功能?

1 个答案:

答案 0 :(得分:1)

创建两个组件的对象必须设置信号和插槽之间的连接。但是,您不应该公开内部组件(即创建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中的复选框时,parent2中的lineEdit被禁用。但是,Parent1对Parent2一无所知。