如何在Qt中连接不同类中的信号和插槽?

时间:2018-01-04 12:46:25

标签: qt signals-slots

我有两个简单的classesclass Aclass B) 在a.h中,我刚刚声明了QPushButton

QPushButton *testBtn = new QPushButton(this);

b.h

class B : public QMainWindow
{
    Q_OBJECT
public:
    explicit B(QWidget *parent = nullptr);
    A testingA;
public slots:
    void testing();
};

b.cpp

B::B(QWidget *parent) : QMainWindow(parent)
{
    connect(testingA.testBtn, &QPushButton::clicked, this, &B::testing);
}

void B::testing()
{
    qDebug() << "testing";
}

我正在尝试将signal中的class Aslot中的class B相关联,但是根据我提供的代码,它无效。

那么正确的方法是什么?
谢谢

修改:
根据PRIME的回答,我做了一些改变。
在A的构造函数中,添加了:

connect(testBtn, &QPushButton::clicked, [this](){OnButtonClicked();});

发出自己定义的OnButtonClicked() signal;

在B的建设者中,改为:

connect(&testingA, &A::OnButtonClicked, this, &B::testing); 

但是当我点击该按钮时,testing slot仍未触发。

编辑2:
在做了一些研究并尝试了几次之后,我发现如果我在B的{​​{1}}中创建object的{​​{1}},然后连接Aconstructor中向A的{​​{1}}发出信号,它会起作用。
但我真的无法弄清楚为什么我无法将B的信号连接到slot的{​​{1}} A
这就是A

中的内容
B

这是因为某些原因导致slot的{​​{1}}对象超出范围吗? 有人能告诉我哪里做错了吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

不要这样做,在A类中隐藏你的按钮,从A类发出你自己定义的信号,让我们把它叫做OnButtonClicked。

级联代码(在A&#39; s内):

connect(testBtn , &QPushButton::clicked, [this](){OnButtonClicked();});

您现在还必须在A类中声明这个新信号: 所以除了现在的A级之外,A级必须拥有以下内容:

class A
{
Q_OBJECT
signals:
    void OnButtonClicked();
};

由于您使用Lambda作为信号OnButtonClicked的插槽,因此无需特殊插槽。

B级连接(在c&C;中执行):

connect(testingA, &A::OnButtonClicked, this, &B::testing);

答案 1 :(得分:2)

您可以在发件人对象中连接信号到信号,例如包含按钮的小部件:

class MyWidget : public QWidget
{
    Q_OBJECT
    QPushButton *pushButton;
public:
    explicit MyWidget(QWidget *parent = nullptr) : QWidget(parent), pushButton(new QPushButton(this)) {
        connect(pushButton, &QPushButton::click, this, &MyWidget::buttonClicked);
    }

signals:

    void buttonClicked();

public slots:
};

顺便说一句,您通常会使用emit关键字发送信号,例如:

emit buttonClicked();

然后是消费者:

class TestObject : public QObject
{
    Q_OBJECT
public:
    explicit TestObject(QObject *parent = nullptr) : QObject(parent) { }

public slots:

    void onButtonClicked() {
        qDebug() << "clicked";
    }
};

并连接两个实例:

MyWidget widget;
TestObject to;

QObject::connect(&widget, &MyWidget::buttonClicked, &to, &TestObject::onButtonClicked);