c++ - 将 QStandardItemModel 从 C++ 传递到 QtQuick/QML TableView 并显示它

标签 c++ qt tableview qml qtquick2

我目前正在尝试将 QStandardItemModel 传递给 QtQuick TableView,然后显示它。这基本上是我的代码(只是一个简化的摘录,所以我希望我没有在此处添加任何额外的错误)。

C++/Qt 部分:

foo.cpp

[...]

QStandardItemModel *Foo::getModel()
{
    QStandardItemModel *model = new QStandardItemModel(this);
    QList<QStandardItem*> standardItemList;

    QList<QString> data;
    data.append("Cat");
    data.append("Dog");
    data.append("Mouse");

    foreach (QString cell, comInputData->getHeadings()) {
        QStandardItem *item = new QStandardItem(cell);
        standardItemList.append(item);
    }

    // we only add one row here for now; more will come later
    model->appendRow(standardItemList);
    standardItemList.clear();
    return model;
}

[...]

main.cpp

Foo f;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("myModel", f.getModel());
engine.load(QUrl(QStringLiteral("qrc:///InputView.qml")));

QtQuick/QML 部分:

InputView.qml

TableView {
    id: monitorInputVectorsTable
    [... positioning and sizing ...] 
    model: myModel
}

我想,我仍然遗漏了 QML 部分中的一些重要部分,是吗?我发现了一些像这样的内联模型定义的例子:

ListModel {
    id: libraryModel
    ListElement{ title: "A Masterpiece" ; author: "Gabriel" }
    ListElement{ title: "Brilliance"    ; author: "Jens" }
}

...以这种方式显示(在 TableView-item 中添加了以下内容):

TableViewColumn{ role: "title"  ; title: "Title" ; width: 100 }
TableViewColumn{ role: "author" ; title: "Author" ; width: 200 }

我的猜测:我也需要添加这样一行。但是,我不知道从哪里获得 C++ QStandardItemModel 的角色?甚至有必要设置角色吗?至少带有“经典”QTreeView 的 QWidgets 示例只是设置了模型,一切都很好......

最佳答案

您可以子类化 QStandardItemModel 并重新实现 roleNames() 来定义您想要的角色名称:

#include <QStandardItemModel>

class MyModel : public QStandardItemModel
{

public:

    enum Role {
        role1=Qt::UserRole,
        role2,
        role3
    };


    explicit MyModel(QObject * parent = 0): QStandardItemModel(parent)
    {
    }
    explicit MyModel( int rows, int columns, QObject * parent = 0 ): QStandardItemModel(rows, columns, parent)
    {
    }

    QHash<int, QByteArray> roleNames() const
    {
         QHash<int, QByteArray> roles;
         roles[role1] = "one";
         roles[role2] = "two";
         roles[role3] = "three";

         return roles;
    }
};

添加项目后,您可以像这样向模型设置数据:

model->setData(model->index(0,0), "Data 1", MyModel::role1);
model->setData(model->index(0,1), "Data 2", MyModel::role2);
model->setData(model->index(0,2), "Data 3", MyModel::role3);

现在在 qml 中,您可以通过角色名称访问不同的列:

TableView {

    TableViewColumn {title: "1"; role: "one"; width: 70 }
    TableViewColumn {title: "2"; role: "two"; width: 70   }
    TableViewColumn {title: "3"; role: "three"; width: 70 }

    model: myModel

}

关于c++ - 将 QStandardItemModel 从 C++ 传递到 QtQuick/QML TableView 并显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25889178/

相关文章:

来自麦克风的连续语音识别 pocketsphinx

css - 无法让边框在 TableCell javafx 2 中左右或上下不同

ios - 如何使用Query.limit和Query.skip?

c++ - 为什么我的 C++ 包含多次定义变量?

c++ - unsigned char 类型变量的 I/O 失败

c++ - 如何在不同线程中使用 std::mutex?

带有 UIView 的 iOS UITableView 自定义页脚

c++ - 在 C++ 输出流中设置宽度

python - QPushButton FocusIn 产生哪个信号?

c++ - 如何隐藏最大化和最小化按钮并在 qml 应用程序窗口中显示关闭按钮?