在Qt中连接多个信号和插槽

Connecting multiple signals and slots in Qt

本文关键字:信号 插槽 Qt 连接      更新时间:2023-10-16

我正在自学如何使用Qt,我已经达到了一个点,当用户与窗体上的控件交互时,我需要一些信号/插槽。

我已经设法让信号和插槽工作,但我想连接相当多的信号和插槽,为了保持我的代码可管理,如果可能的话,最好让它们在自己的单独函数中。

到目前为止,我没有运气将它们从我的主要功能中移出,我已经成功地将对象移动到全局,这似乎仍然有效,但对我没有多大帮助,从那里试图移动引擎或应用程序只会导致错误。据我所知,如果我试图在一个单独的函数中连接它们,那么任何这样的函数返回后,连接都会崩溃。

目前我有一些看起来像这样的工作:

int main(int argc, char *argv[])
  {
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    QObject *object = engine.rootObjects()[0];
    controls myClass;
    QObject::connect(object, SIGNAL(taskComplete(int)), &myClass, SLOT(taskComplete(int)));
    return app.exec();
  }

我有什么选择,这样我就不必把它们都塞进main了?

免责声明:到目前为止,我几乎没有运气弄清楚我在Qt周围的方式,因此我不知道我在做什么,所以如果我完全错了,我想知道。

在QML中发生的事情需要在c++中处理的情况下,在QML端处理"连接"已被证明是有利的。

基本上你的c++代码会将一个或多个基于QObject的对象暴露给QML,例如通过引擎根上下文的setContextProperty(), QML代码只会在需要的时候调用它们的槽。

主要原因是这不会给我们的QML代码强加太多的细节,例如特定的结构,特定的对象具有特定的名称或信号等。c++端提供该功能,QML端在需要时调用它。

您可以创建一个扩展QQuickView的类称为MyCustomQQuickView

在构造函数中设置QML文件:
setSource(QUrl(QStringLiteral("qrc:/main.qml")))

然后,您有一个方法QQuickView::rootObject()来访问QML根对象,因此您可以连接所有信号。

主类的代码看起来像:

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    MyCustomQQuickView view;
    view.show();
    return app.exec();
}