Как немедленно обнаружить изменение состояния флажка в QTreeView? - PullRequest
1 голос
/ 02 июня 2019

Я использую Qt 5.9 на Linux.У меня есть QTreeView, где я устанавливаю пользовательскую модель, производную от QAbstractItemModel, и я заполняю дерево несколькими простыми классами для элементов дерева.Каждый элемент дерева имеет флажок рядом с ним.

У меня установлен следующий атрибут в QTreeView ...

treeView->viewport()->setAttribute(Qt::WA_Hover);

, чтобы при наведении курсора мыши на элемент дерева я могзахватить событие с помощью метода рисования моих делегатов.

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

Есть мысли о том, как немедленно определить, когда состояние флажка изменяется в элементе дерева?

1 Ответ

1 голос
/ 02 июня 2019

Возможным решением является отслеживание изменения состояния флажка с помощью метода editorEvent:

#include <QtWidgets>

class CheckboxDelegate: public QStyledItemDelegate{
    Q_OBJECT
public:
    using QStyledItemDelegate::QStyledItemDelegate;
    bool editorEvent(QEvent *event,
                     QAbstractItemModel *model,
                     const QStyleOptionViewItem &option,
                     const QModelIndex &index) override
    {
        Qt::CheckState last = static_cast<Qt::CheckState>(model->data(index, Qt::CheckStateRole).toInt());
        bool res = QStyledItemDelegate::editorEvent(event, model, option, index);
        Qt::CheckState current = static_cast<Qt::CheckState>(model->data(index, Qt::CheckStateRole).toInt());
        if(last != current)
            Q_EMIT stateChanged(index);
        return  res;
    }
Q_SIGNALS:
    void stateChanged(const QModelIndex & index);
};
#include "main.moc"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStandardItemModel model;
    model.setColumnCount(2);
    for(int i=0; i<4; ++i){
        QList<QStandardItem *> l;
        for (int c=0; c< model.columnCount(); ++c) {
            QStandardItem *parent = new QStandardItem(QString("%1-%2").arg(i).arg(c));
            parent->setCheckable(true);
            l << parent;
            for (int j=0; j<4; ++j) {
                QList<QStandardItem *> ll;
                for (int c=0; c< model.columnCount(); ++c) {
                    QStandardItem *child  = new QStandardItem(QString("%1-%2-%3").arg(i).arg(j).arg(c));
                    child->setCheckable(true);
                    ll << child;
                }
                parent->appendRow(ll);
            }
        }
        model.appendRow(l);
    }
    QTreeView w;
    w.viewport()->setAttribute(Qt::WA_Hover);
    CheckboxDelegate *delegate = new CheckboxDelegate(&w);
    w.setItemDelegate(delegate);
    QObject::connect(delegate, &CheckboxDelegate::stateChanged, [](const QModelIndex & index){
        QString text = index.data().toString();
        Qt::CheckState state = static_cast<Qt::CheckState>(index.data(Qt::CheckStateRole).toInt());
        qDebug() << text << state;
    });
    w.setModel(&model);
    w.resize(640, 480);
    w.expandAll();
    w.show();
    return a.exec();
}
...