0

我很难连接到不同类中定义的 SLOT。我有 2 个类 - 计算和 MainWindow。MainWindow 应该只处理程序的 GUI 部分,而 Computations 处理计算。我正在创建一个计算器。

基本上,我想了解如何从 MainWindow 类连接到计算类中的 SLOT。

4

4 回答 4

7

我猜你已经检查了Qt Signals & Slots 页面。要实现您想要的,您需要在另一个类中有一个类的实例。

因此,例如在您的MainWindow类中,您可以包含Computations该类并为其创建一个成员变量:

#include "computations.h"

class MainWindow : public QMainWindow
{
   Q_ObBJECT
public:
   //..
private:
   Computations *_computation;
};

然后在MainWindow初始化_computation对象 ( _computation = new Computations();) 之后的构造函数中进行这样的连接(适用于 Qt5):

QObject::connect(_computation, &Computations::somethingHappened, this, &MainWindow::doSomeGuiStuff);
QObject::connect(this, &MainWindow::guiThingHappened, _computation, &Computations::doSomeComputation);

取决于它应该走的路。

我希望这有帮助。

于 2018-08-31T08:44:19.860 回答
1

这是另一个版本如何使用,我认为对于初学者来说更容易理解

您需要在类中定义信号和插槽。添加到类的标题,例如向 MainWindow 发送信号,向 Computations 添加插槽

public slots:
    void something();

signals:
    void something_happend();

然后,在您想要使用它的任何地方,在您的示例中mainwindow.cpp,您需要连接信号和插槽。通过 QObject::connect 执行此操作:

QObject::connect(who_emit,SIGNAL(what_signal),who_receive,SLOT(what_slot))

例子:

主窗口.h

signals:
    void something_happend();

计算.h

public slots:
    void something_happend();

主窗口.cpp

Computations *c = new Computations(this);
QObject::connect(this,SIGNAL(something_happend()),c,SLOT(something()));

如果要传递一些参数,要连接的 SIGNAL 和 SLOT 需要具有相同类型的参数:

public slots:
    void something(int c);

signals:
    void something_happend(int c);

QObject::connect(this,SIGNAL(something_happend(int)),c,SLOT(something(int)));
于 2018-09-01T06:13:14.940 回答
0

你需要插槽和信号,因为它们一起工作,就像这样:你的 file.h

public slots:
    void start();

signals:
    void levelChanged(int level);

实施:

void MainBoard::start()
{
    isStarted = true;
    clearBoard();
    emit levelChanged(1);

}

现在你需要链接一个按钮

startButton = new QPushButton(tr("&Start"));
startButton->setFocusPolicy(Qt::NoFocus);

connect(startButton, &QPushButton::clicked, board, &MainBoard::start);
于 2021-08-14T04:53:16.693 回答
0

此类连接属于 UI 和控制器(计算对象)都可用的级别。因此,无论是在 的主体中main,还是在构成应用程序各种元素的高级别的类中(QApplication不过,这样的类通常不应该派生自 )。

如果 UI 类知道计算对象的存在,或者以某种方式与其细节相关联,则几乎总是耦合太紧。我通常将 UI 设计为具有由信号和插槽组成的接口,该接口具有尽可能通用的性质,然后通过信号/插槽连接将其绑定到一个或多个控制器对象。我还利用属性系统以通用方式公开与 UI 相关的属性,通常使用视图模型对象将与 UI 无关的控制器连接到具体类型的 UI。

在你的情况下,我建议既不MainWindow知道Computations,反之亦然:

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  Computations comp;
  MainWindow ui;
  QObject::connect(&comp, ..., &ui, ...);
  /* more connections here */
  ui.show();
  return app.exec();
}

有关更具体的示例,请参阅答案 #1答案 #2

于 2018-08-31T13:35:55.993 回答