Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Checkbox QML如何使QAbstractTableModel与QML tableview可检查_Checkbox_Tableview_Qml_Qtquick2 - Fatal编程技术网

Checkbox QML如何使QAbstractTableModel与QML tableview可检查

Checkbox QML如何使QAbstractTableModel与QML tableview可检查,checkbox,tableview,qml,qtquick2,Checkbox,Tableview,Qml,Qtquick2,我是新来的。我想使qml tableview的每一行都可检查,但它不起作用 包含数据的tableview已成功显示,但不可检查 似乎flags()和setData()函数永远不会运行,role==Qt::CheckStateRole永远不会为true 请帮忙 C++代码 我修改了如下代码,但它不起作用: QVariant TableModel::data(const QModelIndex & index, int role) const { if (index.row

我是新来的。我想使qml tableview的每一行都可检查,但它不起作用

包含数据的tableview已成功显示,但不可检查

似乎flags()和setData()函数永远不会运行,role==Qt::CheckStateRole永远不会为true

请帮忙

C++代码

我修改了如下代码,但它不起作用:

    QVariant TableModel::data(const QModelIndex & index, int role) const {

    if (index.row() < 0 || index.row() >= _fields->size())
        return QVariant();

    if(role == Qt::CheckStateRole) {
        return rowsChk.contains(index.row()) ? Qt::Checked : Qt::Unchecked;
    }

    switch(role) {
        case NameRole:
            return model.name();
        case DescriptionRole:
            return model.description();
        case TypeRole:
            return model.type();
    }

    return QVariant();
}

bool TableModel::setData(const QModelIndex & index, const QVariant & value, int role){
         rowsChecked(index.row(), value) ;
         emit dataChanged(index, index);
        return true;
}
未调用setData()方法,因为您可能尚未重新实现该方法:

QHash<int, QByteArray> roleNames() const;
方法未调用-存在相同的问题。但您可以通过在QML中定义TableViewColumn的委托来解决此问题:

Component {
    id: checkBoxDelegate

Item {
    CheckBox {
        anchors.fill: parent
        checked: styleData.value
    }
}
}
然后将此委托分配给您的列:

  TableViewColumn {
            role: "name"
            title: "Name"
            width: 200
            delegate: checkBoxDelegate
        }
然后该列包含一个复选框控件,该控件的值由方法指定

QVariant FieldModel::data(const QModelIndex & index, int role) const;

对于未选中状态,只返回值0或QString(“false”),对于选中状态,返回值1或QString(“true”)。

我使用“checked:styleData.value”进行了此操作,但当我单击时,复选框从未更新。我认为没有像可检查行这样的事情,可检查行只能是列。如果您需要可检查的行行为,而不需要定义带有复选框的垂直表标题,那么请定义TableView行委托,并在发出其onClicked(int row)信号时设置这些复选框。很抱歉,我不能说得更具体了——我从未实现过这样的表。请参阅我的第一篇文章。我按照你的建议修改了代码,但仍然不起作用。。。
Component {
    id: checkBoxDelegate

Item {
    CheckBox {
        anchors.fill: parent
        checked: styleData.value
    }
}
}
  TableViewColumn {
            role: "name"
            title: "Name"
            width: 200
            delegate: checkBoxDelegate
        }
QVariant FieldModel::data(const QModelIndex & index, int role) const;