繁体   English   中英

C++ 类以时尚的方式暴露于 QML 错误 TypeError: Property '...' of object is not a function

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

我已经成功地向 QML 公开了一个 C++ 类。 它在 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: 对象 UeSqlDatabase(0x1772060) 的属性“isConnected”不是函数

我究竟做错了什么?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM