C ++类暴露于时尚中的QML错误TypeError:对象的属性'...'不是函数

时间:2015-07-25 19:02:04

标签: qt qml qtquick2

我已成功将C ++类暴露给QML。它已在Qt Creator中注册并找到。它的目的是连接到数据库,如下面的代码所示:

A

但是,当我尝试从以下QML代码中调用方法#ifndef UESQLDATABASE_H #define UESQLDATABASE_H #include <QObject> #include <QtSql/QSqlDatabase> class UeSqlDatabase : public QObject { Q_OBJECT Q_PROPERTY(bool m_ueConnected READ isConnected WRITE setConnected NOTIFY ueConnectedChanged) private: bool m_ueConneted; inline void setConnected(const bool& ueConnected) { this->m_ueConneted=ueConnected; } public: explicit UeSqlDatabase(QObject *parent = 0); Q_INVOKABLE inline const bool& isConnected() const { return this->m_ueConneted; } ~UeSqlDatabase(); signals: void ueConnectedChanged(); public slots: void ueConnectToDatabase (const QString& ueStrHost, const QString& ueStrDatabase, const QString& ueStrUsername, const QString& ueStrPassword); }; #endif // UESQLDATABASE_H

isConnected()

我收到以下错误:

  

qrc:/UeMenuButton.qml:92:TypeError:对象的属性'isConnected'UeSqlDatabase(0x1772060)不是函数

我做错了什么?

3 个答案:

答案 0 :(得分:6)

您遇到此错误,因为您已在C ++中声明了属性isConnected,但您是以错误的方式从QML调用它:uePosDatabase.isConnected是正确的方法,而不是uePosDatabase.isConnected()

如果要调用函数isConnected(),则应更改其名称以使其与属性不同,例如getIsConnected()。鉴于您的属性声明,您既不需要直接调用此函数,也不需要使用QML宏从Q_INVOKABLE调用它。

答案 1 :(得分:1)

您必须首先在QML代码中创建所需的对象,然后使用该函数:

您的QML代码:

import QtQuick 2.0
import QSqlDatabase 1.0

Rectangle {
    id: ueMenuButton

    QSqlDatabase {
        id: uePosDatabase
    }
.
.
.
    MouseArea
    {
        id: ueClickArea
        antialiasing: true
        anchors.fill: parent

        onClicked: {
            console.log(uePosDatabase.isConnected())
        }
    }
}

答案 2 :(得分:0)

请注意,如果出现错误,同一.js文件中较早的某些行可能会导致此问题。以下代码将不会执行。