Активация элемента в дереве

98
10 января 2021, 15:50

В QAbstractItemView есть сигнал activated который генерируется если произошло нажатие на элемент. На этот сигнал у меня подвешен слот onItemActivated:

void MyWidget::onItemActivated()
{
    doSmth();
}

Как сделать так, чтобы при нажатии на элемент я мог проверить какие-то условия(или например вывести диалог для подтверждения пользователем) и в случае необходимости отменить активацию элемента. То есть чтобы currentIndex не изменился.

Я пробовал использовать QItemSelectionModel:

 MyWidget::MyWidget()
 {
  ...
 _ui.treeSignalsView->setModel( _treeModel );
 _ui.treeSignalsView->setSelectionModel( new QItemSelectionModel( _treeModel ) );
 connect( _ui.treeSignalsView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MyWidget::onCurrentChanged );
 ...
 }

void MyWidget::onCurrentChanged( const QModelIndex& current, const QModelIndex& previous )
{
    _ui.treeSignalsView->setCurrentIndex(previous);
}

Но так сделать не получается, т.к. setCurrentIndex опять генерирует QItemSelectionModel::currentChanged

Answer 1

Можно попробовать использовать сигнал selectionChanged

connect( _ui.treeSignalsView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MyWidget::onSelectionChanged );

и блокировать повторные сигналы в слоте:

void MyWidget::onSelectionChanged( const QItemSelection &selected, const QItemSelection &deselected )
{
    if (!deselected.isEmpty() && QMessageBox::question(view, "Question", "Save changes?", QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel) == QMessageBox::Cancel){
        QSignalBlocker blocker(_ui.treeSignalsView->selectionModel());
        _ui.treeSignalsView->selectionModel()->select(deselected, QItemSelectionModel::ClearAndSelect);
    } else {
        doSmth();
    }
}
READ ALSO
Переменная SetTimeout Jquery

Переменная SetTimeout Jquery

Каким образом можно задать переменную в 1400 миллисекунд для setTimeout и вызвать ее а не прописывать каждый раз для разных функций setTimeout = 1400

110
Как передать List<int> как параметр из C# в C++ CLI?

Как передать List<int> как параметр из C# в C++ CLI?

Ну собственно в заголовке и есть вопрос

107
некоректо работает Socket сервер

некоректо работает Socket сервер

есть классы 1) Объект состояния сокет-клиента StateObject и 2) сам сервер SocketAsync

100