C ++ Qt信号和插槽

时间:2018-08-31 08:33:41

标签: c++ qt qt-slot

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

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

3 个答案:

答案 0 :(得分:5)

我想您已经检查了Qt Signals & Slots page。要实现您想要的内容,您需要在另一个实例中拥有您的类的一个实例。

例如,在您的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);

取决于应该走的路。

我希望这会有所帮助。

答案 1 :(得分:0)

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

如果UI类知道计算对象的存在或以某种方式与其详细信息联系在一起,则几乎总是太过紧密。我通常将UI设计为具有一个由信号和插槽组成的接口,该接口和插槽在实际可行的情况下具有一般性质,然后通过信号/插槽连接将其绑定到一个或多个控制器对象。我还利用属性系统以通用的方式公开与UI相关的属性,通常使用viewmodel对象将与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();
}

有关更具体的示例,请参见answer #1answer #2

答案 2 :(得分:0)

这是另一种用法,我认为对于初学者来说更容易理解

您需要在类中定义信号和插槽。 添加到类的标题中,例如,发送给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))

示例:

mainwindow.h

signals:
    void something_happend();

computations.h

public slots:
    void something_happend();

mainwindow.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)));