I know how to access C++ function from QML very well, but if the C++ class is derived from QAbstractItemModel, the case seems different. I created a tree model class which is derived from QAbstractItemModel and want to call the function from a qml file, but I get the following error message:
qrc:/TabIMTree/IMTree.qml:135: TypeError: Property 'getIndexByValue' of object IMTreeModel(0x555c381bec90) is not a function
My soure code is as follows
IMTreeModel.h
class IMTreeModel : public QAbstractItemModel
{
Q_OBJECT
Q_ENUMS(ItemRoles)
public:
enum ItemRoles {
NAME = Qt::UserRole + 1,
TYPE,
VALUE
};
IMTreeModel(QObject *parent = NULL);
~IMTreeModel();
void appendChild(const QModelIndex& index);
bool removeRows(int row, int count, QModelIndex parent);
QModelIndex parent(const QModelIndex &index) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);//It's NOT permitted to define a new function to change data, override setData ONLY!
QHash<int, QByteArray> roleNames() const;
QModelIndex getIndexByValue(QVariant varValue) const; //**HERE IS THE PROBLEM!!!**
}
IMTreeModel.cpp
QModelIndex IMTreeModel::getIndexByValue(QVariant varValue) const
{
std::wcout << L"==getIndexByValue==== "<< varValue.toString().toStdWString()<<endl;
return QModelIndex();
}
IMTree.qml
import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQml.Models 2.2
import IMTreeModel 1.0 // which is registered in main.cpp
// qmlRegisterType<IMTreeModel>("IMTreeModel", 1, 0, "IMTreeModel");
Rectangle{
IMTreeModel{
id: treeModel
}
TextField{
id:fldFilter
}
Button{
id:btnApplyFilter
onClicked:{
treeModel.getIndexByValue(fldFilter.text)
}
}
When I clicked the button btnApplyFilter I got the error message. But I have call the function data() and setData() of IMTreeModel successfully from IMTree.qml as following:
treeModel.data(index, IMTreeModel.VALUE).toString()
treeModel.setData(treeView.currentIndex, fldValue.text)
I know both successful functions are built-in functions in class QAbstractItemModel. But why the function getIndexByValue defined by myself can't be called?
Q_INVOKABLE QModelIndex getIndexByValue(QVariant varValue) const
does not work either with the same error message in this occasion.
What's wrong?