4

QAbstractListModel のサブクラスがあり、このモデル サブクラスを GridView にアタッチしました。サブクラスから行を削除すると、GridView は更新されますが、モデルに行を挿入すると、GridView は更新されません。removeR を実装しました

QAbstractListModel の非常に単純なサブクラスがあり、それに QML GridView をアタッチしました。GUI に [追加/削除] ボタンが 2 つあります。Add を押すとモデルに文字列が追加され、GUI が更新されます。remove を押すと、最後の文字列がモデルから削除され、GUI が更新されます。私の問題は、挿入される行が1つだけ追加され、削除してもGUIで何も起こらないことです。私のモデルサブクラスとQMLファイルの実装が与えられています。

名前モデル.cpp

NamesModel::NamesModel(QObject *parent) :
    QAbstractListModel(parent)
{
    QHash<int, QByteArray> roles;
    roles[Qt::UserRole + 1]  = "name";
    setRoleNames(roles);
}
int NamesModel::rowCount(const QModelIndex &parent) const
{
    return this->namesList.count();
}
QVariant NamesModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    switch(role) {
    case (Qt::UserRole + 1):
        return this->namesList.at(index.row());
    default:
        return QVariant();
    }
    return QVariant();
}
bool NamesModel::insertRow(int row, const QModelIndex &parent)
{
    if ( parent.isValid() )
        return false;
    qDebug() << "Row = " << row;
    beginInsertRows(parent, row, row);
    this->namesList.insert(row, ("Hello World " + QString("%1").arg(row)));
    endInsertRows();
    return true;
}
bool NamesModel::insertRows(int row, int count, const QModelIndex &parent)
{
    int existing_count = this->namesList.count();
    beginInsertRows(parent, row, count);
    for ( int i = existing_count; i < (existing_count + count); i++ )
        this->namesList.insert(i, QString("Multi Hello World = %1").arg(i));
    endInsertRows();
    return true;
}
bool NamesModel::removeRows(int row, int count, const QModelIndex &parent)
{
    int existing_count = this->namesList.count();
    beginRemoveRows(parent, row, count);
    for ( int i = (existing_count + count); i < existing_count; i-- )
        this->namesList.removeAt(i);
    endRemoveRows();
    return true;
}

bool NamesModel::removeRow(int row, const QModelIndex &parent)
{
     beginRemoveRows(parent, row, row);
     this->namesList.removeAt(row);
     endRemoveRows();
}

void NamesModel::addName()
{
    int index = this->namesList.count();
    //insertRow(index, QModelIndex());
    insertRows(index, 5, QModelIndex());
    emit layoutChanged();
    emit dataChanged(this->index(index), this->index(this->namesList.count()));
}
void NamesModel::removeName()
{
    int index = this->namesList.count();
    //removeRow(index, QModelIndex()/*this->index(this->namesList.count())*/);
    removeRows(index, 5, QModelIndex());
    emit layoutChanged();
    emit dataChanged(this->index(index), this->index(index + 5));
}

main.qml

Rectangle {
    width: 360
    height: 360
    Text {
        height: 20
        width: 360/2;
        text: "Add Name"
        MouseArea {
            anchors.fill: parent
            onClicked: {
                names.addName();
                console.log("Add Name");
            }
        }
    }
    Text {
        height: 20;
        width: 360/2;
        x: 360/2
        text: "Remove Name";
        MouseArea {
            anchors.fill: parent
            onClicked: {
                names.removeName();
                console.log("Remove Name");
            }
        }
    }

    Component {
        id: gridDelegate

        Text {
            width: 19;      // These are the dimensions of icon image.
            height: 16
            font.pixelSize: 12
            text: name;
        }
    }
    GridView {
        y: 21
        boundsBehavior: Flickable.StopAtBounds

        focus: true
        model: names;
        delegate: gridDelegate
    }
}

beginInsertRows / endInsertRows および beginRemoveRows / endRemoveRows を呼び出していますが、機能していないようです。他の同様のスレッドで提案されているように、begin / end InserRows の後に layoutChanged / dataChanged も呼び出しましたが、効果はありません。

実際、私は実際のプロジェクトでほぼ同じ問題を抱えています。この beginInsertRows などの問題点をテストするために、このアプリケーションを作成しました。

どんな助けでも大歓迎です。

Farrukh Arshadさん、よろしく。

4

1 に答える 1

6

beginInsertRowsを呼び出す方法が正しくありません。関数のドキュメントでは、新しいアイテムの最初のインデックス(行)と挿入されるアイテムの最後の「新しい」インデックス(行+カウント-1)を指定する必要があります。

bool NamesModel::insertRows(int row, int count, const QModelIndex &parent)
{
    int existing_count = this->namesList.count();
    beginInsertRows(parent, row, row + count - 1);
    for ( int i = row; i < (row + count - 1); i++ )
        this->namesList.insert(i, QString("Multi Hello World = %1").arg(i));
    endInsertRows();
    return true;
}

beginRemoveRowsについても同じことが言えます。

bool NamesModel::removeRows(int row, int count, const QModelIndex &parent)
{
    int existing_count = this->namesList.count();
    beginRemoveRows(parent, row, row + count - 1);
    for ( int i = (row + count - 1); i <= row; i-- )
        this->namesList.removeAt(i);
    endRemoveRows();
    return true;
}
于 2012-09-12T20:01:23.973 に答える