Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: 0x0001 от Апрель 17, 2010, 16:50



Название: Собственный Алгоритм Выделения Итемов (работа с мышью)
Отправлено: 0x0001 от Апрель 17, 2010, 16:50
Здравствуйте!
Как сделать собственный алгоритм выделения множества Итемов, например у QTreeView ( надо для дальнейшего перетаскивания классом Drag ).
Стандартные Qt (ContiguousSelection,ExtendedSelection,..) мне, к сожалению, не подошли ( надо - чтобы Итемы в дереве выделялись обычно, к примеру как ContiguousSelection, но отмены выделения уже должны происходить по другому ...)

Спасибо.


Название: Re: Собственный Алгоритм Выделения Итемов (работа с мышью)
Отправлено: kibsoft от Апрель 18, 2010, 23:07
А как должна происходить отмена выделения? Не совсем понятно, что вам нужно реализовать.
В принципе вам подойдет в ассистенте раздел Handling Selections in Item Views (я предполагаю).
На русском тут: http://doc.crossplatform.ru/qt/4.6.x/model-view-selection.html#using-a-selection-model (http://doc.crossplatform.ru/qt/4.6.x/model-view-selection.html#using-a-selection-model).


Название: Re: Собственный Алгоритм Выделения Итемов (работа с мышью)
Отправлено: 0x0001 от Апрель 19, 2010, 12:28
А как должна происходить отмена выделения? Не совсем понятно, что вам нужно реализовать.
В принципе вам подойдет в ассистенте раздел Handling Selections in Item Views (я предполагаю).
На русском тут: http://doc.crossplatform.ru/qt/4.6.x/model-view-selection.html#using-a-selection-model (http://doc.crossplatform.ru/qt/4.6.x/model-view-selection.html#using-a-selection-model).
К сожалению, та тема описывает немного не то..., мне надо изменить Алоритм работы с мышкой выделения элементов списка.
Конкретно - не должно быть отмены выделения при любых операциях мышкой на уже выделенных элементах(клик , 2x клик, и т.д.), стандартные методы Qt по мультивыделениям это не позволяют делать, а отмена выделения только при клике мышкой на другом элементе или клике Правой кнопкой....
Спасибо!


Название: Re: Собственный Алгоритм Выделения Итемов (работа с мышью)
Отправлено: 0x0001 от Апрель 19, 2010, 12:35
и ещё - отмена выделения чтоБ также происходила бы при клике LB только в опр. часте QTreeView


Название: Re: Собственный Алгоритм Выделения Итемов (работа с мышью)
Отправлено: Kolobok от Апрель 19, 2010, 14:06
Тебе надо наследоваться от QTreeView и переопределить метод
Код:
QItemSelectionModel::SelectionFlags QAbstractItemView::selectionCommand ( const QModelIndex & index, const QEvent * event = 0 ) const


Название: Re: Собственный Алгоритм Выделения Итемов (работа с мышью)
Отправлено: 0x0001 от Апрель 20, 2010, 10:55
Тебе надо наследоваться от QTreeView и переопределить метод
Код:
QItemSelectionModel::SelectionFlags QAbstractItemView::selectionCommand ( const QModelIndex & index, const QEvent * event = 0 ) const
Огромное Спасибо! то, что надо!!!
Код:
	virtual QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index, const QEvent *ev = 0) const
{
//ev->type(): 2/3/4/5 mouse: press/release/DblPress/move   ;  6,7: Keyboard
QList<int> mEvt;mEvt<<2<<3<<4<<5;
if (mEvt.contains( ev->type() )) {
const QMouseEvent* Mev = static_cast<const QMouseEvent*>(ev);
mEvt[0]= Mev->type(); //2/3/4/5 mouse: press/release/DblPress/move
mEvt[1]= Mev->buttons();//0/1/2/4 mouse: NoBtn/LB/RB/MB
mEvt[2]= Mev->x();mEvt[3]= Mev->y();//x,y
}
else
return QAbstractItemView::selectionCommand ( index, ev );

//--- Mouse event occur ----
// TEST {
QString str = QVariant(index.data()).toString();//QTreeView item data
str +="(";str +=QString::number(index.row());str +=",";str +=QString::number(index.column());str +=") event:";//Selected item (Column,Row)
for (int i=0;i<4;i++){
str += QString::number(mEvt[i]);str += ";";//Mouse: Function/Btn/(x,y)
}
emit SetTitle(str);//signal ...
// TEST }

if (((index.row()|index.column())<0) && mEvt[3] > 50)// out of index / out of (y)position - Clear All
return (QItemSelectionModel::Clear);
if (mEvt[1] & Qt::LeftButton)
return (QItemSelectionModel::Select|QItemSelectionModel::Rows);
if (mEvt[1] & (Qt::RightButton|Qt::MidButton))
return (QItemSelectionModel::Clear);
//default by Parent
return QAbstractItemView::selectionCommand ( index, ev ) ;
}