У меня есть QTreeView с одним столбцом и несколькими строками (скажем, 5 строк). Чего я хочу добиться, так это того, что если я выберу строку, то при некоторых условиях я хочу перевыбрать предыдущую.
Вот код, который у меня есть:
MyWidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QModelIndex>
#include <QHBoxLayout>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
private slots:
void _OnTreeViewCurrentRowChanged(const QModelIndex &rcqmiCurrIndex,
const QModelIndex &rcqmiPrevIndex);
private:
QHBoxLayout *_pLayout;
QTreeView *_pTreeView;
QStandardItemModel *_pStandardItemModel;
QStandardItem *_pStandardItem;
};
#endif
MyWidget.cpp
#include "MyWidget.h"
static bool bCondition = false;
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
_pLayout = new QHBoxLayout(this);
_pTreeView = new QTreeView(this);
_pStandardItemModel = new QStandardItemModel(_pTreeView);
_pStandardItem = new QStandardItem("Column A");
_pLayout->addWidget(_pTreeView);
_pStandardItemModel->setColumnCount(1);
_pStandardItemModel->setHorizontalHeaderItem(0, _pStandardItem);
_pTreeView->setModel(_pStandardItemModel);
_pTreeView->setSelectionBehavior(QAbstractItemView::SelectRows);
_pTreeView->setSelectionMode(QAbstractItemView::SingleSelection);
_pTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
// add rows
_pTreeView->selectionModel()->blockSignals(true);
for (int i = 0; i < 5; ++i)
{
QStandardItem *pStandardItem = new QStandardItem(
QString("Row: %1").arg(i + 1));
_pStandardItemModel->appendRow(pStandardItem);
}
_pTreeView->selectionModel()->blockSignals(false);
// update view
_pTreeView->viewport()->update();
connect(_pTreeView->selectionModel(),
SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)),
this, SLOT(_OnTreeViewCurrentRowChanged(const QModelIndex &,
const QModelIndex &)));
}
MyWidget::~MyWidget()
{
}
void MyWidget::_OnTreeViewCurrentRowChanged(
const QModelIndex &rcqmiCurrIndex, const QModelIndex &rcqmiPrevIndex)
{
if (bCondition) // some condition
{
_pTreeView->selectionModel()->blockSignals(true);
// select previous index
_pTreeView->selectionModel()->setCurrentIndex(
rcqmiPrevIndex, QItemSelectionModel::SelectCurrent);
_pTreeView->selectionModel()->blockSignals(false);
// update view
_pTreeView->viewport()->update();
}
bCondition = !bCondition;
}
В _OnTreeViewCurrentRowChanged (…), Я вижу, что «выбор» модели выбора древовидного представления обновляется QItemSelectionModel::setCurrentIndex(rcqmiPrevIndex, QItemSelectionModel::SelectCurrent);
но выбор строки в древовидном представлении НЕ обновляется, rcqmiCurrIndex
выбран.
Что мне здесь не хватает?
Буду признателен за любую оказанную помощь. Заранее спасибо.
Использовать QItemSelectionModel::select()
метод.
_pTreeView->selectionModel()->select(rcqmiPrevIndex, QItemSelectionModel::ClearAndSelect);
РЕДАКТИРОВАТЬ
Вероятно, есть еще одна проблема: _OnTreeViewCurrentRowChanged(...)
вероятно, слот вызывается при изменении текущей строки, верно? Это означает, что вы меняете выбор дважды в одном событии. Это не очень хорошая идея. Использовать QTimer
выполнить выбор в следующем цикле событий:
// lambda
auto func = [this, rcqmiPrevIndex](){
_pTreeView->selectionModel()->select(rcqmiPrevIndex, QItemSelectionModel::ClearAndSelect);
}
// A QTimer with a timeout interval of 0 will time out as soon as all the events in the window system's event queue have been processed.
QTimer::singleShot(0, func);
Других решений пока нет …