1

qmlをc ++と統合する方法を学んでいます。QAbstratListModelを継承するカスタム モデル クラスStringListModelを実装しました。そして、 StringListModel を使用するためのmain.qmlがあります。QML ビューは初期値を正しく表示できます。モデルを定期的に変更する別のスレッドがあります。モデルが変更されたことを示すために beginResetModel() と endResetModel() を使用します。

ただし、モデルは変更されたままですが、ビューは更新されませんでした。

これが私のソースコードです。何がいけなかったのか教えてください。ありがとう!

=== main.qml ===

Rectangle {
    width: 360
    height: 360

    Grid {
        id: gridview
        columns: 2
        spacing: 20

        Repeater {
            id: repeater
            model: StringListModel {
            id:myclass
        }

        delegate: Text {
            text: model.title
        }
    }
}

=== カスタム class.h ===

class StringListModel : public QAbstractListModel{
    Q_OBJECT

public:
    StringListModel(QObject *parent = 0);

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role) const;

    QHash<int, QByteArray> roleNames() const;

    void newItem();
private:
    QStringList stringList;

};


class UpdateThread : public QThread {
    Q_OBJECT

    StringListModel *mMyClass;

public:
    UpdateThread(StringListModel * myClass);
protected:
    void run();
};

=== カスタム class.cpp ===

StringListModel::StringListModel(QObject *parent) : QAbstractListModel(parent)
{
    stringList << "one" << "two" << "three";
    QThread *thread = new UpdateThread(this);
    thread->start();
}

int StringListModel::rowCount(const QModelIndex &parent) const
{
    return stringList.count();
}

QVariant StringListModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (index.row() >= stringList.size())
        return QVariant();

    if (role == Qt::UserRole + 1)
        return stringList.at(index.row());
    else
        return QVariant();
}

QHash<int, QByteArray> StringListModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[Qt::UserRole + 1] = "title";

    return roles;
}
void StringListModel::newItem()
{
    qDebug() << "size: " << stringList.size();
    beginResetModel();
    stringList << "new";
    endResetModel();
}

UpdateThread::UpdateThread(StringListModel * myClass)
{
    mMyClass = myClass;
}

void UpdateThread::run()
{
    while (true) {
        mMyClass->newItem();
        msleep(1000);
    }
}
4

1 に答える 1