Russian Qt Forum
Ноябрь 25, 2024, 02:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Управление возможностью перехода по узлам дерева  (Прочитано 4491 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« : Октябрь 16, 2013, 18:19 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 16, 2013, 20:02 »

вешай фильтр событий, лови в нем события нажатия клавиатуры/мыши и возвращай true чтобы блокировать событие
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Октябрь 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 вообще через обработчик не пробегает.
Попробую еще на отдельном примере...
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
VPS
Гость
« Ответ #3 : Октябрь 16, 2013, 21:41 »

А если просто отключать "TreeView" через "setEnabled(false)"?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Октябрь 16, 2013, 21:51 »

для мышки scriptTree->viewport()->installEventFilter(this);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #5 : Октябрь 16, 2013, 22:10 »

для мышки scriptTree->viewport()->installEventFilter(this);
Да, точно! Спасибо!

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #6 : Октябрь 17, 2013, 06:56 »

Посмотрите как это сделано в QTreeWidget. Там есть такой сигнальчик с указателями на предыдущий и новый элемент дерева.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #7 : Октябрь 17, 2013, 16:57 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 23.