C++Qt信号和插槽
C++ Qt Signals and Slots
我很难连接到不同类中定义的插槽。我有 2 个类 - 计算和主窗口。MainWindow应该只处理程序的GUI部分,而Computings处理计算。我正在创建一个计算器。
基本上,我想了解如何从 MainWindow 类连接到计算类中的插槽。
我想你已经检查了Qt Signals&Slots页面。要实现你想要的东西,你需要在另一个中有一个类的实例。
例如,在MainWindow
类中,可以包含Computations
类并创建其成员变量:
#include "computations.h"
class MainWindow : public QMainWindow
{
Q_ObBJECT
public:
//..
private:
Computations *_computation;
};
然后在初始化_computation
对象(_computation = new Computations();
(后的MainWindow
构造函数中,您执行如下连接(适用于Qt5(:
QObject::connect(_computation, &Computations::somethingHappened, this, &MainWindow::doSomeGuiStuff);
QObject::connect(this, &MainWindow::guiThingHappened, _computation, &Computations::doSomeComputation);
取决于它应该走哪条路。
我希望这有所帮助。
这是另一个版本如何使用,我认为初学者更容易理解
您需要在类中定义信号和插槽。 添加到类的标头,例如信号到主窗口,插槽到计算
public slots:
void something();
signals:
void something_happend();
然后,在您想要使用它的任何地方,在主窗口中的示例中.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)));
此类连接属于 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();
}
有关更具体的示例,请参阅答案 #1 或答案 #2。
你需要插槽和信号,因为它们一起工作,如下所示: 您的文件.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);
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- QObject::连接无法将信号连接到*this*对象的插槽
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- C++Qt信号和插槽
- Qt moveToThread,带有参数的信号/插槽
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 从 QWidgetList 访问 QWidget 子插槽/信号 (QList<QWidget*>)
- 两个对象QT之间的示例插槽/信号
- QT对象::连接:没有此类插槽信号到线程插槽
- Qt QAxWidget - WebBrowser手动设置插槽/信号
- 没有这样的插槽/信号(Qt)