Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将QTreeView迁移到QML TreeView:如何管理多个角色?_Qt_Treeview_Qml_Qtquickcontrols - Fatal编程技术网

将QTreeView迁移到QML TreeView:如何管理多个角色?

将QTreeView迁移到QML TreeView:如何管理多个角色?,qt,treeview,qml,qtquickcontrols,Qt,Treeview,Qml,Qtquickcontrols,我正试图使用QML模块和删除Qt小部件重写我的应用程序。我有一个非常复杂的QTreeView,用于显示曲目、专辑和艺术家 以下是我现在拥有的: 我正在构建QStandardItem的子类,其中我重新定义了type(),以便在委托中正确绘制它们,如下所示: switch (item->type()) { case Miam::IT_Album: this->paintRect(painter, o); this->drawAlbum(pa

我正试图使用QML模块和删除Qt小部件重写我的应用程序。我有一个非常复杂的QTreeView,用于显示曲目、专辑和艺术家

以下是我现在拥有的:

我正在构建QStandardItem的子类,其中我重新定义了type(),以便在委托中正确绘制它们,如下所示:

switch (item->type()) {
    case Miam::IT_Album:
        this->paintRect(painter, o);
        this->drawAlbum(painter, o, item);
    break;
    case Miam::IT_Artist:
        this->paintRect(painter, o);
        this->drawArtist(painter, o, item);
    break;
    ...
    default:
    QStyledItemDelegate::paint(painter, o, index);
    break;
}
写起来很痛苦(管理画笔、像素、画线),但效果很好

现在让我们重写为QML 正在进行的工作:

我的问题是能够在同一列上显示多个数据角色。据我所知,在QML中,您需要为TreeView(或TableView)的每一列使用TableViewColumn。每个列都映射到一个角色

这是我正在进行的工作TreeView:

TreeView {
    alternatingRowColors: false
    TableViewColumn {
        id: column
        title: qsTr("Artists")
        role: "text"
        delegate: Rectangle {
            implicitHeight: height
            implicitWidth: width
            color: Material.background
            Image {
                id: disc
                sourceSize.height: 20
                sourceSize.width: 20
                source: "qrc:/images/disc.png"
                visible: libraryItemModel.data("cover")
            }
            Label {
                anchors.left: disc.visible ? disc.right : undefined
                text: styleData.value
                color: Material.foreground
            }
        }
    }
    model: libraryItemModel
    anchors.top: parent.top
    anchors.bottom: parent.bottom
    anchors.left: parent.left
    anchors.rightMargin: jumpLetters.width
    anchors.right: parent.right
    horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
    style: TreeViewStyle {
        backgroundColor: appSettings.menuPaneColor
        frame: Rectangle {
            border.width: 0

        }
    }
}
在我的legacy LibraryItemModel类中,我在读取本地SQLite数据库时做了如下工作:

    auto loadTrack = [=] (QSqlRecord& r) -> TrackItem* {
    TrackItem *trackItem = new TrackItem;
    trackItem->setText(r.value(trackTitle).toString());
    trackItem->setData(r.value(uri).toString(), Miam::DF_URI);
    trackItem->setData(r.value(trackNumber).toString(), Miam::DF_TrackNumber);
    trackItem->setData(r.value(disc).toString(), Miam::DF_DiscNumber);
    trackItem->setData(r.value(trackLength).toUInt(), Miam::DF_TrackLength);
    if (r.value(rating).toInt() != -1) {
        trackItem->setData(r.value(rating).toInt(), Miam::DF_Rating);
    }
    trackItem->setData(r.value(artist).toString(), Miam::DF_Artist);
    trackItem->setData(r.value(album).toString(), Miam::DF_Album);
    trackItem->setData(!r.value(host).toString().isEmpty(), Miam::DF_IsRemote);
    return trackItem;
};

QSqlQuery q(...);
while (q.next()) {
    ...
    albumItem->appendRow(loadTrack(r));
}
制作多角色专栏需要哪些解决方案?我还能做什么?该行:

visible: libraryItemModel.data("cover")

例如,不起作用。

尝试
model.text
而不是
styleData.value
,并从列中删除
角色
属性


使用
model.[role]
可以从模型中获取此特定项的每个角色。

尝试
model.text
而不是
styleData.value
并从列中删除
role
属性

使用
model.[role]
可以从模型中获取此特定项目的每个角色