我很难连接到不同类中定义的SLOT。我有2类-计算和MainWindow。 MainWindow应该仅处理程序的GUI部分,而Computations处理计算。我正在创建一个计算器。
基本上,我想了解如何从MainWindow类连接到Computations类中的SLOT。
答案 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();
}
答案 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)));