Используя QTreeView, как выделить только определенную строку/столбец с помощью вызывающей функции?

Я использую С++ Qt5. В настоящее время у меня есть QStandardItemModel, отображаемый как QTreeView с несколькими строками и столбцами. Я знаю об использовании setStyleSheet(), но проблема в том, что каждая строка и столбец, на которые наводится указатель мыши, выделяются.

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


person Ender    schedule 28.10.2018    source источник
comment
Решение в этих случаях состоит в том, чтобы использовать делегата для изменения рисования и использовать роль, чтобы указать, что этот элемент должен быть изменен, рисование не может быть выполнено с помощью qss, поэтому ответ для вашего конкретного случая будет зависеть от того, как вы хотите рисовать .   -  person eyllanesc    schedule 28.10.2018
comment
Я проверил это немного быстро. Я работал с этим, и он не выделяется, когда мышь находится над ячейкой. Мысли?   -  person Ender    schedule 29.10.2018
comment
Другое дело, если вы читаете, что ваш вопрос не говорит о каком-либо специальном событии, поэтому мой ответ является общей перспективой, например, вы должны определить, когда происходит событие, получить QModelIndex и обновить данные, связанные с ролью и QModelIndex .   -  person eyllanesc    schedule 29.10.2018
comment
так я сказал в своем комментарии к конкретному случаю, поэтому теперь ваша задача состоит в том, чтобы узнать, как обнаружить событие наведения, получить QModelIndex и обновить данные, если вы хотите получить точный ответ, спросите что-то точное, а не общее.   -  person eyllanesc    schedule 29.10.2018


Ответы (1)


Решением для персонализированной картины является использование пользовательского делегата и указание того, какой элемент должен изменить цвет, должна использоваться роль, в следующем коде я показываю пример:

#include <QApplication>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QTreeView>

class StyledItemDelegate: public QStyledItemDelegate{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
protected:
    void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const{
        QStyledItemDelegate::initStyleOption(option, index);
        if(index.data(Qt::UserRole +1).toBool())
            option->backgroundBrush = QBrush(Qt::red);
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTreeView w;
    StyledItemDelegate delegate(&w);
    w.setItemDelegate(&delegate);

    QStandardItemModel model;
    model.setColumnCount(4);
    w.setModel(&model);

    for(int i=0; i<4; i++){
        auto it = new QStandardItem(QString::number(i));
        model.appendRow(it);
        for(int j=0; j<3; j++){
            it->appendRow(new QStandardItem(QString("%1-%2").arg(i).arg(j)));
        }
    }
    QObject::connect(&w, &QTreeView::clicked, [&](const QModelIndex & index){
        bool last_state = model.data(index, Qt::UserRole +1).toBool();
        model.setData(index, !last_state, Qt::UserRole +1);
    });
    w.expandAll();
    w.show();
    return a.exec();
}
person eyllanesc    schedule 28.10.2018