Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Пантер от Апрель 07, 2009, 18:01



Название: [4.x.x] QTreeView и selection.
Отправлено: Пантер от Апрель 07, 2009, 18:01
Категорически всех приветствую.
При клике на итем QTreeView, он сразу становится выделенным, что не нужно. Нужно, чтобы итем становился курентом, но не селектом. Не могу воткнуть что нужно отнаследовать QTreeView или QItemSelectionModel, и можно ли без наследования обойтись? Пытался использовать installEventFilter, но в нем не отлавливаются события мыши для QTreeView. :(


Название: Re: [4.x.x] QTreeView и selection.
Отправлено: EhTemka от Апрель 07, 2009, 18:28
QAbstractItemView::setSelectionMode(QAbstractItemView::NoSelection)  подойдет?


Название: Re: [4.x.x] QTreeView и selection.
Отправлено: Пантер от Апрель 07, 2009, 18:32
Не вариант. Нужна возможность выделения, причем MultiSelect.


Название: Re: [4.x.x] QTreeView и selection.
Отправлено: EhTemka от Апрель 07, 2009, 18:57
Ну, когда мне нужен был контролируемый селект, я наследовался от QItemSelectionModel.

переопределял там две функции, что-то типо этого

Код
C++ (Qt)
void SelectModel::select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command)
{
if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
QItemSelectionModel::select(selection, command);
}
}
 
void SelectModel::select(const QModelIndex &selection, QItemSelectionModel::SelectionFlags command)
{
if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
QItemSelectionModel::select(selection, command);
}
}
 

Да и есче, учти, что если ты нажал шифт или сонтрол не в фокусе приложения (или еще хуже отпустил), то флаг keyboardModifiers не обноаляется. я делал такую вещь :

вместо прямой проверки (QApplication::keyboardModifiers() & Qt::ShiftModifier)... использовал свой флаг, который сбрасывал при астивации/деактивации главного окна

Код
C++ (Qt)
bool MainWindow::event(QEvent *e)
{
if (e->type() == QEvent::WindowActivate
|| e->type() == QEvent::WindowDeactivate) {
setIsSelectMyFlag(false);
}
 
return QMainWindow::event(e);
}