如何连接Qt中不同级别的信号和插槽?

如何连接Qt中不同级别的信号和插槽?,qt,signals-slots,Qt,Signals Slots,我有两个简单的类(A类和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.

我有两个简单的
A类
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";
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    B b;
    A w;
    w.show();
    return a.exec();
}
发出自己定义的
OnButtonClicked()
信号


在B的结构中,改为:

connect(&testingA, &A::OnButtonClicked, this, &B::testing); 
但当我点击按钮时,
测试
插槽
仍未触发。

编辑2:
在做了一些研究并尝试了几次之后,我发现如果我在
a
构造函数
中创建
B
对象
,然后将
a
的信号连接到
a
中的
插槽
,它就会工作
但是我真的不明白为什么我不能把
A
的信号连接到
B
插槽

这是
main.cpp中的内容:

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

void B::testing()
{
    qDebug() << "testing";
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    B b;
    A w;
    w.show();
    return a.exec();
}
是不是因为某种原因,
A
的对象超出了
B
的范围?

谁能告诉我哪里做错了?非常感谢。

不要这样做,将您的按钮隐藏在类A中,从类A发出您自己定义的信号,让我们将其称为OnButtonClicked

级联代码(在c'tor中):

您现在还必须在A类中声明此新信号: 因此,A级除了现在拥有的以外,还必须具备以下几点:

class A
{
Q_OBJECT
signals:
    void OnButtonClicked();
};
不需要特殊插槽,因为您使用Lambda作为信号ON按钮CLICKED的插槽

B类连接(在c'tor中进行):


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

级联代码(在c'tor中):

您现在还必须在A类中声明此新信号: 因此,A级除了现在拥有的以外,还必须具备以下几点:

class A
{
Q_OBJECT
signals:
    void OnButtonClicked();
};
不需要特殊插槽,因为您使用Lambda作为信号ON按钮CLICKED的插槽

B类连接(在c'tor中进行):


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

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

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

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

我尝试了您提供的方法,但我遇到了以下错误:
没有匹配的函数用于调用“B::connect(A&,void(A:*)(),B*,void(B:*)())”connect(testingA,&A::OnButtonClicked,this,&B::testing),这是为什么?@TheodoreTang:您是否在一个文件的标题中声明了信号“OnButtonClicked”?请参阅编辑。我尝试了您提供的方法,但出现了以下错误:
没有匹配函数用于调用“B::connect(A&,void(A:*)(),B*,void(B:*)()”connect(testingA,&A::OnButtonClicked,this,&B::testing),这是为什么?@TheodoreTang:您是否在一个文件的标题中声明了信号“OnButtonClicked”?查看编辑。您有两个类对象
A
testingA
w
?@eyllansc,是的,我在
B
的构造函数中声明了
testingA
对象,以便连接
B
的构造函数中的
A
信号。“这有什么不对劲吗?@eyllanesc我想我知道我现在哪里做错了。我删除了
A
的对象w,在
B
的构造函数中创建了一个
testingA
,并将其显示在屏幕上。然后它工作了。如果您在继承自
QObject
的类的实现中,例如小部件只是
connect(发送方,&ClaseSender::signal,接收方,&ClaseReceiver::slot_和_或_signal)
,那么您可以在这两个对象都存在的地方建立连接,iif如果您在继承自QObject的类(例如main.cpp)的实现之外,则必须执行以下操作:
QObject::connect(发送方和类发送方::信号、接收方和类接收方::插槽和信号)
阅读以下内容以了解更多详细信息:您有两个类对象
A
testingA
w
?@eyllansc,是的,我在
B
的构造函数中声明了一个
testingA
对象,以便连接
A
信号
B
的构造函数。“这有什么不对劲吗?@eyllanesc我想我知道我现在哪里做错了。我删除了
A
的对象w,在
B
的构造函数中创建了一个
testingA
,并将其显示在屏幕上。然后它工作了。如果您在继承自
QObject
的类的实现中,例如小部件只是
connect(发送方,&ClaseSender::signal,接收方,&ClaseReceiver::slot_和_或_signal)
,那么您可以在这两个对象都存在的地方建立连接,iif如果您在继承自QObject的类(例如main.cpp)的实现之外,则必须执行以下操作:
QObject::connect(发送方和类发送方::信号、接收方和类接收方::插槽和\u或\u信号)
阅读以下内容以了解更多详细信息: