Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Март 19, 2014, 16:00



Название: Model-View
Отправлено: demaker от Март 19, 2014, 16:00
Подскажите, как сделать, чтобы при
нажатии указателя на вложенность в окне вьювера (QTreeView)
ничего не происходило.


Название: Re: Model-View
Отправлено: UltraPenguin от Март 19, 2014, 19:10
Имеется ввиду чтобы не раскрывалась данная ветка?

UPD: если да, то почему нельзя хватать сигнал
Код:
expand ( const QModelIndex & index )
и просто закрывать эту ветку обратно?

Жесткое издевательство над пользователем ;D


Название: Re: Model-View
Отправлено: demaker от Март 20, 2014, 10:05
А как ветку закрывать ???
Код:
collapse ( const QModelIndex)
Cпасибо


Название: Re: Model-View
Отправлено: UltraPenguin от Март 20, 2014, 10:31
Кстати да, я очепятился. Сигнал такой
Код:
expanded ( const QModelIndex & index )

Цитировать
А как ветку закрывать  ???

Ну я бы сделал так:
- создал слот в наследнике от QTreeView (что-то типа slotCollapseIfNeeded(const QModelIndex & index ) )
- в нем написал бы логику того что мы будем закрывать обратно и когда, и для закрытия есть
Код:
collapse (  index ); //вызов слота
или
Код:
emit collapsed (  index ); //вызов сигнала и соответственно слота
- подключил свой слот к сигналу expanded

Я такого не реализовывал, поэтому не уверен есть ли вероятность, что сначала выполнится твой код, а лишь потом код слота expand (что в таком случае просто вновь развернет ветку)


Название: Re: Model-View
Отправлено: VPS от Март 20, 2014, 10:55
Я такого не реализовывал, поэтому не уверен есть ли вероятность, что сначала выполнится твой код, а лишь потом код слота expand (что в таком случае просто вновь развернет ветку)

Из документации:
void QTreeView::expanded ( const QModelIndex & index )   [signal]

This signal is emitted when the item specified by index is expanded.


Название: Re: Model-View
Отправлено: UltraPenguin от Март 20, 2014, 11:16
2vps

ок, понятно что он сигналит, когда ветка раскрылась. А если у нас два слота подключены к этому сигналу? Какой выполнится первым - тот, что по умолчанию или кастомный? В первом случае все норм, а во втором все попытки закрыть ветку сразу после открытия из кастомного слота обречены.


Название: Re: Model-View
Отправлено: kambala от Март 20, 2014, 11:54
может проще просто временно скрывать эту стрелочку?


Название: Re: Model-View
Отправлено: demaker от Март 20, 2014, 12:08
может проще просто временно скрывать эту стрелочку?

Как?


Название: Re: Model-View
Отправлено: VPS от Март 20, 2014, 12:26
ок, понятно что он сигналит, когда ветка раскрылась. А если у нас два слота подключены к этому сигналу? Какой выполнится первым - тот, что по умолчанию или кастомный? В первом случае все норм, а во втором все попытки закрыть ветку сразу после открытия из кастомного слота обречены.

В документации вроде написано, что при возникновении сигнала, слоты вызываются один за другим, порядок не определен.

П.С.: В исходниках класса "QTreeView" сигнал "expanded" вызывается в слоте "expand", т.е. если у Вас один пользовательский слот привязан к сигналу "expanded" (а в Вашем предложении вроде так), то он и отработает.


Название: Re: Model-View
Отправлено: Igors от Март 20, 2014, 13:43
Прильнем к первоисточнику
Код
C++ (Qt)
void QTreeView::mousePressEvent(QMouseEvent *event)
{
Q_D(QTreeView);
   bool handled = false;
   if (style()->styleHint(QStyle::SH_Q3ListViewExpand_SelectMouseType, 0, this) == QEvent::MouseButtonPress)
       handled = d->expandOrCollapseItemAtPos(event->pos());
if (!handled && d->itemDecorationAt(event->pos()) == -1)
       QAbstractItemView::mousePressEvent(event);
}
 
А скрыть можно как показывл kambala
Код
C++ (Qt)
tree->setRootIsDecorated(false);


Название: Re: Model-View
Отправлено: Johnik от Март 20, 2014, 13:55
В документации вроде написано, что при возникновении сигнала, слоты вызываются один за другим, порядок не определен.
http://qt-project.org/doc/qt-5/qobject.html#connect-3
If a signal is connected to several slots, the slots are activated in the same order in which the connections were made, when the signal is emitted.
т.е., вызываются в том порядке в котором были сделаны подключения (посмотрел начиная с 4.7, там так же)


Название: Re: Model-View
Отправлено: kambala от Март 20, 2014, 14:09
А скрыть можно как показывл kambala
Код
C++ (Qt)
tree->setRootIsDecorated(false);
это для всех сразу, а я имел в виду для конкретного (с помощью убирания соответствующего флага у нужного айтема в модели)


Название: Re: Model-View
Отправлено: VPS от Март 20, 2014, 15:39
http://qt-project.org/doc/qt-5/qobject.html#connect-3
If a signal is connected to several slots, the slots are activated in the same order in which the connections were made, when the signal is emitted.
т.е., вызываются в том порядке в котором были сделаны подключения (посмотрел начиная с 4.7, там так же)

Да, Вы правы.
Я вычитал то, что написал выше в wiki на сайте http://developer.nokia.com и, видимо, там устаревшая информация.