【问题标题】:Receiving a signal with parameter from C++ class in QML从 QML 中的 C++ 类接收带有参数的信号
【发布时间】:2018-08-03 14:17:34
【问题描述】:

我想从 QML 中的 C++ QObject 类接收信号,我已阅读以下指南:

https://doc.qt.io/archives/qt-4.8/qtbinding.html#receiving-signals

但我无法获得结果,这是我的示例代码:

myclass.h

class myClass : public QObject
 {
  Q_OBJECT

  public:

   explicit myClass(QObject *parent = nullptr);

   Q_INVOKABLE void incrementNumber(){
       number++;
       qDebug()<<number;
       emit numberChanged(number);
   }

  signals:
     Q_INVOKABLE int numberChanged(int &number);
  public slots:

  private:
     int number = 0;
  };

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QScopedPointer<myClass> myclass (new myClass);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    engine.rootContext()->setContextProperty("myclass",myclass.data());
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML

 Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")


    Button{
        onClicked: {
            myclass.incrementNumber()
        }
    }
    Text {
        id: texty
        text: "0"
    }

    Connections{
        target: myclass
        onNumberChanged: {
            texty.text = number
            console.log ("number Changed to: " + number)
        }
    }
}

我收到关于 QML 声明的错误

错误:无法将 [未定义] 分配给 QString"

所以我猜我做错了连接。

【问题讨论】:

    标签: c++ qt qml qt5 qt-signals


    【解决方案1】:

    您有以下错误:

    • 根据docs 的信号:它们永远不能有返回类型(即使用 void)。另一方面,它是Q_INVOKABLE 没有意义,最后你必须传递整数的值,而不是引用。

    • 您必须在加载 QML 之前导出 QObject。

    *.h

    signals:
        void numberChanged(int number);
    

    ma​​in.cpp

    ...
    QQmlApplicationEngine engine;
    
    engine.rootContext()->setContextProperty("myclass", myclass.data());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    ...
    

    【讨论】:

    • 它起作用了,我传递了值而不是引用。至于其他错误,它甚至在我改变它们之前就起作用了,但我承认它们确实是错误的,但似乎 qt 并不介意它们。
    • 非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多