C++ class exposed to QML error in fashion TypeError: Property '...' of object is not a function

C++ class exposed to QML error in fashion TypeError: Property '...' of object is not a function

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

#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

但是,当我尝试从以下 QML 代码

调用方法 isConnected()
import QtQuick 2.0

Rectangle
{
    id: ueMenuButton

    property string ueText;

    width: 192
    height: 64
    radius: 8

    states: [
        State
        {
            name: "ueStateSelected"

            PropertyChanges
            {
                target: gradientStop1
                color: "#000000"
            }

            PropertyChanges
            {
                target: gradientStop2
                color: "#3fe400"
            }
        }
    ]

    gradient: Gradient
    {
        GradientStop
        {
            id: gradientStop1
            position: 0
            color: "#000000"
        }

        GradientStop
        {
            position: 0.741
            color: "#363636"
        }

        GradientStop
        {
            id: gradientStop2
            position: 1
            color: "#868686"
        }

    }

    border.color: "#ffffff"
    border.width: 2
    antialiasing: true

    Text
    {
        id: ueButtonText
        color: "#ffffff"
        text: qsTr(ueText)
        clip: false
        z: 0
        scale: 1
        rotation: 0
        font.strikeout: false
        anchors.fill: parent
        font.bold: true
        style: Text.Outline
        textFormat: Text.RichText
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
        font.pixelSize: 16
}

    MouseArea
    {
        id: ueClickArea

        antialiasing: true
        anchors.fill: parent

        onClicked:
        {
            uePosDatabase.ueConnectToDatabase("127.0.0.1",
                                              "testDb",
                                              "testUser",
                                              "testPassword");
            if(uePosDatabase.isConnected()==true)
            {
                ueMenuButton.state="ueStateSelected";
            }
            else
            {
                ueMenuButton.state="base state"
            }
        }
    }
}

我收到以下错误:

qrc:/UeMenuButton.qml:92: TypeError: Property 'isConnected' of object UeSqlDatabase(0x1772060) is not a function

我做错了什么?

你有这个错误是因为你在 C++ 中声明了 属性 isConnected 但你在 QML 中以错误的方式调用它: uePosDatabase.isConnected 是正确的方式,不是uePosDatabase.isConnected()

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

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

您必须先在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())
        }
    }
}