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

时间:2016-10-14 08:47:41

标签: c++ qt qml qt-quick

我正在教自己如何使用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();
  }

我有什么选择,所以我不必将它全部塞进主?

免责声明:到目前为止,我很少运气到Qt周围,因此我不知道我在做什么,如果我完全咆哮我想知道的错误的树。

2 个答案:

答案 0 :(得分:2)

对于QML中发生的事情并且需要在C ++中处理的事情,已经证明有必要处理" connect"在QML方面。

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

主要原因是这并没有对我们的QML代码施加太多细节,例如:某些结构,某些具有特定名称或信号的物体等。 C ++端提供了功能,QML端在需要时调用它。

答案 1 :(得分:0)

您可以创建一个扩展名为QQuickView的{​​{1}}的类。

在构造函数中,设置QML文件:

MyCustomQQuickView

然后,您有一个方法setSource(QUrl(QStringLiteral("qrc:/main.qml"))) 可以访问QML根对象,因此您可以连接所有信号。

主类的代码如下:

QQuickView::rootObject()