如何连接两个不同的对象

时间:2019-06-23 11:02:28

标签: c++ qt signals signals-slots slots

我有两个对象,一个对象将保存图形,另一个对象有几个按钮。如何使用(连接),以便在您按下按钮1时,会在书包中显示题词或在日程表中填充新的题词?

例如,我按下由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();
}

2 个答案:

答案 0 :(得分:0)

好吧,我假设您有class BtnBox,并且它在类定义中已经具有此名称(通常在.h文件中):

signals:
    void clickedBtn1();

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

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

将信号连接到信号将仅执行信号转发。不论代码中有什么,都用正确的按钮指针替换ui->button1


请注意如何 做到这一点,只是为了提供一些思考的方法:另一种方法是从类中公开按钮1,因此在您的main()之后,您可以执行以下操作:QObject::connect(panel->getButton1(), SIGNAL(clickedBtn1()), plot, SLOT(slotPrinter()));。但这通常被认为有点脏,像这样暴露BtnBox类的内部。最好公开信号,然后使用该类的代码不必关心如何发出信号(例如,从BtnBox的几个不同部分发出信号)或BtnBox的内部实现方式可能会发生变化(例如,将其转换为QML)。

答案 1 :(得分:0)

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

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

但是,如果您希望对类BtnBox进行自定义行为,则可以在BtnBox的头文件中创建一个信号。

signals:
    void clickedBtn1();

并使用:emit clickedBtn1();每当您要发出它时,您的连接都应该起作用。

无需执行信号,您只需发射它即可。

不必真正使用发射关键字,如果您愿意,可以只使用clickedBtn();