在 Qt 中连接多个信号和槽
Connecting multiple signals and slots in Qt
我正在自学如何使用 Qt,我已经达到了这样一个地步,当用户与表单上的控件交互时,我需要一些 signals/slots。
我已经设法让信号和槽工作,但我想连接相当多的信号和槽,为了让我的代码易于管理,最好让它们在它们自己的单独函数中,如果完全有可能。
到目前为止,我没有运气将它们从我的主要功能中移出我已经成功地将对象移动到全局,这似乎仍然有效但对我没有太大帮助,从那里尝试移动引擎或应用程序只会导致错误。据我所知,如果我确实尝试将它们连接到一个单独的函数中,那么连接将在第二个任何此类函数中崩溃 returns.
目前我有一些看起来像这样工作的东西:
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 的方法,因此我不知道自己在做什么,所以如果我完全找错了我想知道的树。
您可以创建一个扩展 QQuickView
的 class,名为 MyCustomQQuickView
。
进入构造函数,设置QML文件:
setSource(QUrl(QStringLiteral("qrc:/main.qml")))
然后,您有一个方法 QQuickView::rootObject()
可以访问 QML 根对象,因此您可以连接所有信号。
您的主要 class 代码如下所示:
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
MyCustomQQuickView view;
view.show();
return app.exec();
}
如果事情发生在 QML 中并且需要在 C++ 中处理,事实证明在 QML 端处理 "connect" 是有利的。
基本上,您的 C++ 代码会将一个或多个基于 QObject
的对象公开给 QML,例如通过引擎根上下文的 setContextProperty()
,QML 代码会在需要时调用它们的插槽。
主要原因是这不会对我们的 QML 代码强加太多细节,例如某些结构、具有特定名称或信号的某些对象等。
C++ 端提供功能,QML 端在需要时调用它。
我正在自学如何使用 Qt,我已经达到了这样一个地步,当用户与表单上的控件交互时,我需要一些 signals/slots。
我已经设法让信号和槽工作,但我想连接相当多的信号和槽,为了让我的代码易于管理,最好让它们在它们自己的单独函数中,如果完全有可能。
到目前为止,我没有运气将它们从我的主要功能中移出我已经成功地将对象移动到全局,这似乎仍然有效但对我没有太大帮助,从那里尝试移动引擎或应用程序只会导致错误。据我所知,如果我确实尝试将它们连接到一个单独的函数中,那么连接将在第二个任何此类函数中崩溃 returns.
目前我有一些看起来像这样工作的东西:
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 的方法,因此我不知道自己在做什么,所以如果我完全找错了我想知道的树。
您可以创建一个扩展 QQuickView
的 class,名为 MyCustomQQuickView
。
进入构造函数,设置QML文件:
setSource(QUrl(QStringLiteral("qrc:/main.qml")))
然后,您有一个方法 QQuickView::rootObject()
可以访问 QML 根对象,因此您可以连接所有信号。
您的主要 class 代码如下所示:
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
MyCustomQQuickView view;
view.show();
return app.exec();
}
如果事情发生在 QML 中并且需要在 C++ 中处理,事实证明在 QML 端处理 "connect" 是有利的。
基本上,您的 C++ 代码会将一个或多个基于 QObject
的对象公开给 QML,例如通过引擎根上下文的 setContextProperty()
,QML 代码会在需要时调用它们的插槽。
主要原因是这不会对我们的 QML 代码强加太多细节,例如某些结构、具有特定名称或信号的某些对象等。 C++ 端提供功能,QML 端在需要时调用它。