如何连接两个不同的对象
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();
我有两个对象,一个用来保存图表,另一个用来放置几个按钮。如何使用(连接)以便当您按下按钮 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();