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& 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# 的派生类中可用?