Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sergek от Октябрь 16, 2013, 18:19



Название: [РЕШЕНО] Управление возможностью перехода по узлам дерева
Отправлено: sergek от Октябрь 16, 2013, 18:19
Коллеги, дайте подсказку, пожалуйста, по такой задаче.
На главной форме есть объекты QTreeView и QPlainTextEdit. В узлах представления - наименования неких текстов (скриптов), в текстовом редакторе отображается их содержимое. При перемещении по дереву обновляется текст в редакторе. Текст можно редактировать.
Нужно запретить переход к другому узлу представления, если не сохранены изменения текущего текста. Т.е. дать возможность выбора пользователю сохранить/отказаться от изменений и только после этого перейти к другому узлу.
Хорошо, если есть что-то типа:
Код:
void MyTreeView::selectionChangingEvent(QКакой-тоEvent *event)
{
    if (agreeToSave()) {
        saveText();
        event->accept();
    } else {
        event->ignore();
    }
}
только никак не могу найти нужного обработчика. Может, это делается иначе?


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: kambala от Октябрь 16, 2013, 20:02
вешай фильтр событий, лови в нем события нажатия клавиатуры/мыши и возвращай true чтобы блокировать событие


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: sergek от Октябрь 16, 2013, 21:38
вешай фильтр событий, лови в нем события нажатия клавиатуры/мыши и возвращай true чтобы блокировать событие
Я так пробовал, не получилось:
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    ...
    scriptTree->installEventFilter(this);
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event){
    if(obj==scriptTree){
        QEvent::Type t=event->type();
        if (t == QEvent::FocusAboutToChange || t == QEvent::KeyPress) {
            return true;
        }
    }
    return QMainWindow::eventFilter(obj, event);
}
А QEvent::MouseButtonPress вообще через обработчик не пробегает.
Попробую еще на отдельном примере...


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: VPS от Октябрь 16, 2013, 21:41
А если просто отключать "TreeView" через "setEnabled(false)"?


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: kambala от Октябрь 16, 2013, 21:51
для мышки scriptTree->viewport()->installEventFilter(this);


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: sergek от Октябрь 16, 2013, 22:10
для мышки scriptTree->viewport()->installEventFilter(this);
Да, точно! Спасибо!

А если просто отключать "TreeView" через "setEnabled(false)"?
Как-то не очень.  :) Да и с отказом от сохранения изменений будут сложности...


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: Bepec от Октябрь 17, 2013, 06:56
Посмотрите как это сделано в QTreeWidget. Там есть такой сигнальчик с указателями на предыдущий и новый элемент дерева.


Название: Re: Управление возможностью перехода по узлам дерева
Отправлено: sergek от Октябрь 17, 2013, 16:57
Посмотрите как это сделано в QTreeWidget. Там есть такой сигнальчик с указателями на предыдущий и новый элемент дерева.
Слона-то я и не заметил... :( Дело в том, что аналогичный сигнал я использую для вывода текста (в TreeView сигнал selectionChanged от ItemSelectionModel).
Тормознул на том, что сигнал испускается уже после перехода и выделения другого узла. Но никто не мешает в соединенном с ним слоте проанализировать условия, выдать MessageBox, и при необходимости, вернуть выделение назад.
Немного, на мой взгляд, непривычно, но сойдет.
Спасибо всем! Тему закрываю.