Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: itan от Июль 06, 2006, 12:08



Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: itan от Июль 06, 2006, 12:08
Решил изменить содержимое всплывающего окна у QComboBox, так чтобы всместо QListView появлялся QTreeView.

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


И все бы хорошо, если бы не одно НО - ComboBox всегда схлопывает свой список, при поступлении события MouseRelease (при выборе элемента). Получается, что когда я хочу раскрыть узел дерева список исчезает!
Как быть? Можно ли изменить такое стандартное поведение?


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: bigirbis от Июль 06, 2006, 14:41
Есть вариант отловить с QTreeView сигнал entered ( const QModelIndex & index ). Затем вызвать QTreeView::setExpanded ( const QModelIndex & index, bool expanded ). И все будет честно. И мышкой кликать не надо. Только вот с логикой работы этого механизма повозиться придется.
...но если надо...


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: itan от Июль 06, 2006, 15:10
Да можно и вообще инициализировать так, чтобы раскрывать все вложенные списки перед началом, но только это не выход...


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: bigirbis от Июль 06, 2006, 15:15
Речь о том, чтобы при наведении мыши итем раскрывался, а при выходе из ветки дерева - сворачивался.


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: itan от Июль 06, 2006, 15:28
Все равно не вариант, я думаю нормальный пользователь не поймет такого поведения. В плане удобства хотелось бы иметь полноценный QTreeView.


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: bigirbis от Июль 06, 2006, 16:00
А ежели через eventFilter отловить евент нажатия кнопки мыши на QTreeView?... а потом, если он был произведен при раскрытии или закрытии элемента, то зажать?


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: itan от Июль 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 так и не дождался,  наверное его кто-то уже зажал... :(
Похожии проблемы у меня уже были, я о них писал тута (http://prog.org.ru/forum/topic_3240.html)


Название: [QT 4.1.4] QComboBox с древовидной структурой
Отправлено: itan от Июль 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);
}


Думаю, теперь дело пойдет быстрее  :)