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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QT 4.1.4] QComboBox с древовидной структурой  (Прочитано 5751 раз)
itan
Гость
« : Июль 06, 2006, 12:08 »

Решил изменить содержимое всплывающего окна у QComboBox, так чтобы всместо QListView появлялся QTreeView.

Код:
ui.list_box->setModel(new CMyTreeModel(this));
ui.list_box->setView(new CMyTreeView(this));


И все бы хорошо, если бы не одно НО - ComboBox всегда схлопывает свой список, при поступлении события MouseRelease (при выборе элемента). Получается, что когда я хочу раскрыть узел дерева список исчезает!
Как быть? Можно ли изменить такое стандартное поведение?
Записан
bigirbis
Гость
« Ответ #1 : Июль 06, 2006, 14:41 »

Есть вариант отловить с QTreeView сигнал entered ( const QModelIndex & index ). Затем вызвать QTreeView::setExpanded ( const QModelIndex & index, bool expanded ). И все будет честно. И мышкой кликать не надо. Только вот с логикой работы этого механизма повозиться придется.
...но если надо...
Записан
itan
Гость
« Ответ #2 : Июль 06, 2006, 15:10 »

Да можно и вообще инициализировать так, чтобы раскрывать все вложенные списки перед началом, но только это не выход...
Записан
bigirbis
Гость
« Ответ #3 : Июль 06, 2006, 15:15 »

Речь о том, чтобы при наведении мыши итем раскрывался, а при выходе из ветки дерева - сворачивался.
Записан
itan
Гость
« Ответ #4 : Июль 06, 2006, 15:28 »

Все равно не вариант, я думаю нормальный пользователь не поймет такого поведения. В плане удобства хотелось бы иметь полноценный QTreeView.
Записан
bigirbis
Гость
« Ответ #5 : Июль 06, 2006, 16:00 »

А ежели через eventFilter отловить евент нажатия кнопки мыши на QTreeView?... а потом, если он был произведен при раскрытии или закрытии элемента, то зажать?
Записан
itan
Гость
« Ответ #6 : Июль 06, 2006, 16:47 »

попробывал так:
Код:
....
treeView = new CMyTreeView(this);
treeView->installEventFilter(this);
....
bool CDialog::eventFilter(QObject * watched, QEvent * event)
{
if (event->type() == QEvent::MouseButtonRelease && watched == treeView)
{
return true;
}
return QObject::eventFilter(watched, event);
}


правда, события MouseButtonRelease так и не дождался,  наверное его кто-то уже зажал... Грустный
Похожии проблемы у меня уже были, я о них писал тута
Записан
itan
Гость
« Ответ #7 : Июль 07, 2006, 11:41 »

Получилось! Оказывается, чтобы отловить события от мыши фильтр надо инсталить не для самого виджета (QTreeView), а для его так называемой области просмотра (viewport) т.е. :
Код:

....
treeView->viewport()->installEventFilter(this);
....
bool CDialog::eventFilter(QObject * watched, QEvent * event)
{
if (event->type() == QEvent::MouseButtonRelease && watched == treeView->viewport())
{
return true;
}
return QObject::eventFilter(watched, event);
}


Для других вещей, я так понимаю, в т.ч. и для обработки нажатия клавиш, достаточно самого виджета:

Код:

....
treeView->installEventFilter(this);
....
bool CDialog::eventFilter(QObject * watched, QEvent * event)
{
if (event->type() == QEvent::KeyPress && watched == treeView)
{
return true;
}
return QObject::eventFilter(watched, event);
}


Думаю, теперь дело пойдет быстрее  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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