![](/img/trans.png)
[英]Cannot invoke c++ method from qml: "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.