我已成功将C ++类暴露给QML。它已在Qt Creator中注册并找到。它的目的是连接到数据库,如下面的代码所示:
A
但是,当我尝试从以下QML代码中调用方法#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
isConnected()
我收到以下错误:
qrc:/UeMenuButton.qml:92:TypeError:对象的属性'isConnected'UeSqlDatabase(0x1772060)不是函数
我做错了什么?
答案 0 :(得分:6)
您遇到此错误,因为您已在C ++中声明了属性isConnected
,但您是以错误的方式从QML调用它:uePosDatabase.isConnected
是正确的方法,而不是uePosDatabase.isConnected()
。
如果要调用函数isConnected()
,则应更改其名称以使其与属性不同,例如getIsConnected()
。鉴于您的属性声明,您既不需要直接调用此函数,也不需要使用QML
宏从Q_INVOKABLE
调用它。
答案 1 :(得分:1)
您必须首先在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())
}
}
}
答案 2 :(得分:0)
请注意,如果出现错误,同一.js文件中较早的某些行可能会导致此问题。以下代码将不会执行。