如何连接两个不同的对象

How to connect two different objects

我有两个对象,一个用来保存图表,另一个用来放置几个按钮。如何使用(连接)以便当您按下按钮 1 时,在 debag 中显示铭文或用新的日程表填充?

例如,我按下由 class BtnBox 创建的按钮,然后显示我的图形。如何使用connect()?

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QThread>
#include "btnbox.h"
#include "plot.h"

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

    BtnBox *panel = new BtnBox(&a);
    Plot *plot = new Plot();

    QObject::connect(panel, SIGNAL(clickedBtn1()), plot, SLOT(slotPrinter()));
//    panel->show();

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(plot);
    mainLayout->addWidget(panel);

    QWidget window;

    window.setLayout(mainLayout);
    window.show();

    return a.exec();
}

好的,我假设你有 class BtnBox,并且它已经在 class 定义中(通常在 .h 文件中):

signals:
    void clickedBtn1();

Qt moc 将生成该方法的实现,你不需要在这里做任何事情。但是您确实需要发出该信号。在许多情况下,您会在正确的位置添加 emit clickedBtn1();,但在这种情况下,您可能希望在 BtnBox::BtnBox 构造函数中执行类似的操作:

connect(ui->button1, SIGNAL(clicked()), this, SIGNAL(clickedBtn1()));

将信号连接到信号将简单地进行信号转发。将 ui->button1 替换为指向按钮的正确指针,无论您的代码中包含什么。


关于如何的注意事项,只是提供一点思考的依据:另一种方法是公开class 中的按钮 1,因此在您的 main() 中,您可以执行如下操作:QObject::connect(panel->getButton1(), SIGNAL(clickedBtn1()), plot, SLOT(slotPrinter()));。但这通常被认为有点脏,像这样暴露了 BtnBox class 的内部结构。最好公开信号,然后使用 class 的代码不需要关心它是如何发出的(例如从 BtnBox 的几个不同部分),或者 [=18 的内部实现方式=] 可能会改变(例如将其转换为 QML)。

也许你可以使用 QPushButton::clicked 信号并编写如下内容:

connect(ui->pushButtonObj, &QPushButton::clicked, plot, &Plot::slotPrinter);

但是如果你想要你的 class BtnBox 的自定义行为,你可以在 BtnBox 的头文件上创建一个信号。

signals:
    void clickedBtn1();

并使用:emit clickedBtn1();只要你想发出它,你的连接就应该工作。

不需要执行信号,你只需要发出它。

emit 关键字不是必需的,如果需要,可以简单地使用 clickedBtn();