I keep getting this error for some reason. Everything seems to work when I use this to pass a C++ class instance to QML.
main.cpp:
QQmlApplicationEngine engine;
gui::Wallet wallet;
engine.rootContext()->setContextProperty("Wallet", &wallet);
But what I really want to do is create an uncreatable type and import it in my main.qml.
In my main.cpp file, I've replaced the previous code with this line:
qmlRegisterUncreatableType<gui::Wallet>("neroshop.Wallet", 1, 0, "Wallet", "Wallet cannot be instantiated directly.");
main.qml:
import QtQuick 2.12
import QtQuick.Controls 2.12
import neroshop.Wallet 1.0
ApplicationWindow {
id: mainWindow
visible: true
title: qsTr("neroshop")
width: 1280
height: 720
minimumWidth: 850
minimumHeight: 500
color: "#ffffff"
NeroshopComponents.ProgressBar {
id: moneroDaemonSyncBar
radius: daemonSyncBar.radius
foregroundColor: NeroshopComponents.Style.moneroOrangeColor
backgroundColor: "#8c8c8c"
hoverEnabled: true
anchors.verticalCenter: parent.verticalCenter
Timer {
interval: 1 // trigger every x miliseconds
running: true
repeat: true
onTriggered: {
moneroDaemonSyncBar.value = Wallet.getSyncPercentage()
}
}
}
}
Header where I declare my wallet class:
#pragma once
#ifndef WALLET_PROXY_HPP_NEROSHOP
#define WALLET_PROXY_HPP_NEROSHOP
#include <QObject>
#include <QString>
#include <QStringList>
#include <QVariant>
#include <memory> // std::unique_ptr
#include "../core/wallet.hpp"
namespace neroshop {
namespace gui { // or just remove the "gui" namespace and rename gui::Wallet to WalletProxy?
class Wallet : public QObject, public neroshop::Wallet {
Q_OBJECT
// properties (for use in QML)
Q_PROPERTY(neroshop::Wallet* wallet READ getWallet WRITE setWallet);// NOTIFY wallet_changed);
//Q_PROPERTY(<type> <variable_name> READ <get_function_name>)
public:
enum KeyfileStatus {
KeyfileStatus_Ok = 0,
KeyfileStatus_Wrong_Password,
KeyfileStatus_No_Matching_Passwords,
KeyfileStatus_Exists,
};
Q_ENUM(KeyfileStatus)
// functions (for use in QML)
////explicit Wallet(QObject* parent = 0);
Q_INVOKABLE int createRandomWallet(const QString& password, const QString& confirm_pwd, const QString& path) const;
Q_INVOKABLE void closeWallet(bool save = false);
Q_INVOKABLE QVariantMap createUniqueSubaddressObject(unsigned int account_idx, const QString & label = "");
Q_INVOKABLE double getSyncPercentage() const;
Q_INVOKABLE unsigned int getSyncHeight() const;
Q_INVOKABLE unsigned int getSyncStartHeight() const;
Q_INVOKABLE unsigned int getSyncEndHeight() const;
Q_INVOKABLE QString getSyncMessage() const;
Q_INVOKABLE QString getMnemonic() const;
Q_INVOKABLE QStringList getMnemonicList() const;
Q_INVOKABLE QString getPrimaryAddress() const;
Q_INVOKABLE QStringList getAddressesAll() const;
Q_INVOKABLE QStringList getAddressesUsed() const;
Q_INVOKABLE QStringList getAddressesUnused() const;
Q_INVOKABLE double getBalanceLocked(unsigned int account_index) const;
Q_INVOKABLE double getBalanceLocked(unsigned int account_index, unsigned int subaddress_index) const;
Q_INVOKABLE double getBalanceUnlocked(unsigned int account_index) const;
Q_INVOKABLE double getBalanceUnlocked(unsigned int account_index, unsigned int subaddress_index) const;
Q_INVOKABLE neroshop::Wallet * getWallet() const;
Q_INVOKABLE void setWallet(const neroshop::Wallet* wallet);
Q_INVOKABLE void daemonExecute(const QString& ip, const QString& port, bool confirm_external_bind, bool restricted_rpc, bool remote, QString data_dir, QString network_type, unsigned int restore_height);// const;
Q_INVOKABLE bool isGenerated() const;
Q_INVOKABLE bool fileExists(const QString& filename) const;
private:
std::unique_ptr<neroshop::Wallet> wallet;
public:
Wallet();
~Wallet();
};
}
}
#endif
I was expecting it to work right away but instead I got this error:
qrc:/qml/main.qml:186: TypeError: Property 'getSyncPercentage' of object [object Object] is not a function
qrc:/qml/main.qml:186: TypeError: Type error
getSyncPercentage
is indeed a function attached to the Wallet class. I don't know why it does not recognize it as a function. Am I doing something wrong here?