【问题标题】:How to connect two different objects如何连接两个不同的对象
【发布时间】:2019-11-05 11:20:45
【问题描述】:

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

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

【问题讨论】:

  • BtnBox 是否真的有一个clickedBtn1() 信号和Plot 一个slotPrinter() 插槽?
  • 是的,BtnBox 有一个方法 clickedBtn1() 作为信号,但我现在不知道在那里写。我需要在clickedBtn1() 中写什么?而slotPrinter() 在调试控制台中写一些东西,例如
  • 我需要在 clickedBtn1() 中写什么? 你没有实现信号。

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


【解决方案1】:

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

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

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

signals:
    void clickedBtn1();

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

信号不需要实现,只需发出即可。

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

【讨论】:

  • 是的,它的工作。更多我想使用另一种方法connect()。为此,我必须将插槽 slotPointer() 设为 public 和第一个按钮。但我试图让他们保密。 PlotBtnBox 类包含所有必要的图形元素,即按钮和时间线。我无法访问 BtnBox 类和插槽 slotPrinter 中的按钮,因为它们是私有的。如何将这些属性保密,但使用不同类型的连接? plot.h ` 私人插槽: void slotPrinter(); ` btnbox.h ` private: QPushButton *btn1; `
  • 考虑在 BtnBox 内进行连接,它可能会起作用,因为您可以访问所有按钮。我认为即使它是私有的,也可以连接 slotPrinter,因为只有在没有信号(作为函数)的情况下调用 slotPrinter 时才应该应用公共和私有。
  • 您可以像这样进行连接:connect(ui-&gt;pushButton1,SIGNAL(clicked()),plot, SLOT(slotPrint())); 但在这种情况下,您将需要 BtnBox 中的绘图对象。
【解决方案2】:

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

signals:
    void clickedBtn1();

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

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

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


注意如何这样做,只是为了提供一点思考:另一种方法是从类中公开按钮 1,所以在你的main() 然后你可以做这样的事情:QObject::connect(panel-&gt;getButton1(), SIGNAL(clickedBtn1()), plot, SLOT(slotPrinter()));。但这通常被认为有点脏,像这样暴露BtnBox 类的内部结构。最好公开信号,然后使用该类的代码不需要关心它是如何发出的(例如从BtnBox 的几个不同部分),或者BtnBox 的内部实现可能如何改变(例如转换到 QML)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多