Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
C++ 具有动态列数的QML TableView_C++_Qt_Qml_Qtquick2 - Fatal编程技术网

C++ 具有动态列数的QML TableView

C++ 具有动态列数的QML TableView,c++,qt,qml,qtquick2,C++,Qt,Qml,Qtquick2,我一直在尝试使用QMLTableView来显示QAbstractTableModel。等式中缺少的部分似乎是,在表视图中不可能有可变数量的列,尽管覆盖了qabstractemmodel::roleNames,它应该告诉Qt我的列的数量和名称。我尝试仅使用QML来测试这一点: import QtQuick 2.0 import QtQuick.Controls 1.1 Rectangle { anchors.fill: parent property real showImage

我一直在尝试使用QML
TableView
来显示
QAbstractTableModel
。等式中缺少的部分似乎是,在
表视图中不可能有可变数量的列,尽管覆盖了
qabstractemmodel::roleNames
,它应该告诉Qt我的列的数量和名称。我尝试仅使用QML来测试这一点:

import QtQuick 2.0
import QtQuick.Controls 1.1

Rectangle {
    anchors.fill: parent
    property real showImage: 1.0
    width: 500
    TableView {
        id: myTable
        model: myModel
        //        TableViewColumn {
        //            role: "title"; title: "Name"; width: 200
        //        }
    }

    ListModel {
        id: myModel
        ListElement {
            title: "item one"
        }
        ListElement {
            title: "item two"
        }
    }
}
运行时,这不会显示任何内容,尽管
TableView
的模式包含定义了角色的

但是,如果上述代码未注释,并且定义了
TableViewColumn
,则该列将按预期显示该角色的数据,但该表仍不会显示任何其他角色。显然,这只适用于静态定义的列数,而不是我的情况,因为在运行时之前列数是未知的

与我的实际例子基本相同,只是我的模型是用C++定义的。 似乎这可能已经被问到了,但没有得到任何回应

编辑:我尝试调用javascript函数:

function addColumnToTable(roleName) {
    var columnString = 'import QtQuick 2.3; import QtQuick.Controls 1.2; TableViewColumn {role: "'
            + roleName + '"; title: "' + roleName + '"; width: 40}';
    var column = Qt.createQmlObject(
                columnString
                , myTable
                , "dynamicSnippet1")
    myTable.addColumn(column);
}
从C++开始:

QVariant roleName = "name";
QObject *root = view->rootObject();
QMetaObject::invokeMethod(root, "addColumnToTable", Q_ARG(QVariant, roleName));

<>这至少允许我动态地从C++中添加列,虽然不是从模型/视图体系结构中添加的。然而,Yoann的解决方案远比这好。

您可以使用
TableView的
资源
属性动态创建所需数量的
TableViewColumn

您必须在自定义模型类中添加一个方法,该方法将为您提供要显示的角色名称

QML:

Component
{
    id: columnComponent
    TableViewColumn{width: 100 }
}

TableView {
    id: view
    anchors.fill: parent
    resources:
    {
        var roleList = myModel.customRoleNames
        var temp = []
        for(var i=0; i<roleList.length; i++)
        {
            var role  = roleList[i]
            temp.push(columnComponent.createObject(view, { "role": role, "title": role}))
        }
        return temp
    }

    model: myModel
class MyModel: public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(QStringList userRoleNames READ userRoleNames CONSTANT)

public:
    explicit MyModel(QObject *parent = 0);

    enum MyModelRoles {
        UserRole1 = Qt::UserRole + 1,
        UserRole2,
        ...
    };

    QStringList userRoleNames();
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    ...

private:
    QHash<int, QByteArray> roleNames() const;
    ...

};
...
...

QHash<int, QByteArray> MyModel::roleNames() const {
    QHash<int, QByteArray> roles = QAbstractListModel::roleNames ();
    roles[UserRole1] = "whatever";
    roles[UserRole2] = "youwant";
    return roles;
}

QStringList MyModel::userRoleNames() // Return ordered List of user-defined roles
{
    QMap<int, QString> res;
    QHashIterator<int, QByteArray> i(roleNames());
    while (i.hasNext()) {
        i.next();
        if(i.key() > Qt::UserRole)
            res[i.key()] = i.value();
    }
    return res.values();
}

...
...
组件
{
id:列组件
TableViewColumn{宽度:100}
}
桌面视图{
id:视图
锚定。填充:父级
资源:
{
var roleList=myModel.customRoleNames
var temp=[]
for(var i=0;i Qt::UserRole)
res[i.key()]=i.value();
}
返回res.值();
}
...
...

有资源的解决方案不适合我(Qt 5.6)。TableView未更新

这对我很有用:

Component{
    id: columnComponent
    TableViewColumn{width: 30 }
}

TableView {
    id: tableView
    model: listModel
    property var titles: somethingDynamic
    property var curTitles: {
        var t=[]
        for(var i=0;i<columnCount;i++){
            t.push(getColumn(i).title)
        }
        return t
    }
    onTitlesChanged:{
        for(var i=0;i<titles.length;i++){
            if(curTitles.indexOf(titles[i])==-1){
                var column = addColumn(columnComponent) 
                column.title=titles[i]
                column.role=titles[i]                   
            }
        }
        for(var i=curTitles.length-1;i>=0;i--){
            if(titles.indexOf(curTitles[i])==-1){
                removeColumn(i)
            }
        }
    }
}
组件{
id:列组件
TableViewColumn{宽度:30}
}
桌面视图{
id:tableView
模型:listModel
属性变量标题:somethingDynamic
属性变量限制:{
var t=[]

对于(var i=0;i极好的答案!我必须仔细阅读文档才能找到
resources
属性,即使从中我也不知道它可以以这种方式使用。