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

Posted

技术标签:

【中文标题】C++ 类以时尚 TypeError 暴露于 QML 错误:对象的属性“...”不是函数【英文标题】:C++ class exposed to QML error in fashion TypeError: Property '...' of object is not a function 【发布时间】:2015-07-25 19:02:03 【问题描述】:

我已经成功地向 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”不是函数

我做错了什么?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我看到这个代码:Q_INVOKABLE inline const bool&amp; isConnected(),Q_INVOKABLE 不应该声明一个方法吗?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于C++ 类以时尚 TypeError 暴露于 QML 错误:对象的属性“...”不是函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 包装 c++ 类以在 Lua 中使用它 - 需要简单的示例

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误

在 Windows 中呈现 Qm 问题

string类以及其常用的成员函数

C++ 节点类、链表、LIFO、FIFO