我已经划分了QAbstractTableModel的子类。现在我想转到QML方面。我发现的所有示例都使用Q_INVOKABLE,即data或setData来公开类的重写方法。可以将整个QAbstractTableModel对象作为Q_INVOKABLE传递吗?如果是,具体如何做到这一点?
发布于 2019-06-04 14:29:23
Q_INVOKABLE用于将QObject派生类型的方法公开给QML。您可以使用Qt property system从您通过QML上下文提供给QML的“全局对象”公开您的QAbstractTableModel (正如您在问题下面所评论的那样)。
您可以从文档中阅读有关exposing Attributes of C++ Types to QML的更多信息。
从QAbstractTableModel派生的MyTableModel:
class MyTableModel : public QAbstractTableModel
{
Q_OBJECT
};通过属性系统公开MyTableModel成员变量的MyGlobalObject:
class MyGlobalObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QAbstractTableModel* myTableModel READ myTableModel CONSTANT)
public:
MyGlobalObject(QObject *parent = nullptr) : QObject(parent), m_myTableModel(new MyTableModel) { }
MyTableModel *myTableModel() { return m_myTableModel.data(); }
private:
QScopedPointer<MyTableModel> m_myTableModel;
};在main中设置为context属性的MyGlobalObject实例:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
MyGlobalObject model;
engine.rootContext()->setContextProperty("myGlobalObject", &model);
}作为QML TableView模型的MyTableModel:
import QtQuick 2.12
TableView {
model: myGlobalObject.myTableModel
}https://stackoverflow.com/questions/56429377
复制相似问题