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);
}