Уведомлять элемент модели при нажатии элемента списка QML - PullRequest
0 голосов
/ 29 апреля 2018

Я разрабатываю небольшое приложение на qt, используя QML. Я хотел бы показать список кликабельных элементов там. У меня есть класс IssueHolder, производный от QObject, чтобы представить элемент для визуализации там. Я создал модель для таких предметов

class IssuesModel : public QAbstractListModel
{
    Q_OBJECT

public:
    IssuesModel(QObject *parent = 0);

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

    const QList<IssueHolder*>& issues() const { return _issues; }

protected:
    QHash<int, QByteArray> roleNames() const override;

private: //Members
    QList<IssueHolder*> _issues;
};

В классе представления я установил свою модель на часть qml следующим образом

 _view = new QQuickView;    
_mainSetModel = new IssuesModel(this);
_view->rootContext()->setContextProperty("mainSetModel", _mainSetModel);

После этого я создал делегат в своем файле QML

 ListView {
    // Some properties here

    model: mainSetModel

    delegate: Item {
        // Some properties here

        IssueDelegate {                
            id: issuesDelegate

            // Some properties here

            signal pressed()

            MouseArea {
                onClicked: { issuesDelegate.pressed(); }
            }
        }
    }
}

Я бы хотел что-то сделать, когда щелкнул мой элемент списка, но я не хочу реализовывать логику приложения в файле QML. Поэтому я бы хотел отреагировать на действие клика делегата, чтобы, если пользователь щелкнет какой-либо элемент в моем списке, соответствующий экземпляр IssueHolder будет уведомлен. Как я могу это сделать?

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете объявить IssueHolder роль в вашей модели:

enum {
    IssueHolderRole = Qt::UserRole
};

Затем, переопределение roleNames():

QHash<int, QByteArray> IssuesModel::roleNames() const
{
    QHash<int, QByteArray> names;
    names.insert(IssueHolderRole, "issueHolder");
    return names;
}

Вам также потребуется учесть новую роль в вашей функции data(). В документации есть много примеров того, как это сделать, но суть такова:

if (role == IssueHolderRole)
    return QVariant::fromValue(_issues.at(index.row()));

В IssueHolder объявите вызываемую функцию или слот:

Q_INVOKABLE void doStuff();

В вашем делегате ответьте на щелчок:

delegate: Item {
    // Some properties here

    IssueDelegate {                
        id: issuesDelegate

        // Some properties here

        MouseArea {
            onClicked: model.issueHolder.doStuff()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...