Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Август 27, 2014, 08:11



Название: Вопрос по сигналу/слоту
Отправлено: koldun90 от Август 27, 2014, 08:11
Здравствуйте делаю файловый менеджер
(http://i053.radikal.ru/1408/d8/f010fa9252b9.png) (http://www.radikal.ru)

файловый менеджер в treeview
собственно я начинаю кликать по файлам или папкам... зажав клавишу ctrl добавляются объекты в список
затем нажимаю пкм появляется меню.
но когда я активирую пункт меню у меня почему то еще и происходит сигнал treeview_clicked( клик по файлу или папке) воз можно сделать так чтобы когда появлялось меню ( при нажатии пкм) и после активации пункта меню не испускался сигнал клика по модели\?


Название: Re: Вопрос по сигналу/слоту
Отправлено: gil9red от Август 27, 2014, 08:21
Можно посмотреть в сторону:
http://qt-project.org/doc/qt-4.8/qwidget.html#customContextMenuRequested
http://qt-project.org/doc/qt-4.8/qwidget.html#contextMenuEvent
http://qt-project.org/doc/qt-4.8/qwidget.html#contextMenuPolicy-prop

Вот тут (https://github.com/gil9red/NotesManager/blob/master/NavigationPanel/foldernavigationwidget.cpp)(on_treeView_customContextMenuRequested) работал с customContextMenuRequested


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Август 27, 2014, 19:05
вы бы что посоветовали сделать?


Название: Re: Вопрос по сигналу/слоту
Отправлено: Bepec от Август 27, 2014, 19:23
А вы разграничьте RightClick и LeftClick и сами управляйте выделением.

А так то это нормальная ситуация - как и везде. К примеру тоталкоммандер - натыкиваем группу, потом на ещё одном правый клик - и он присоединяется к группе + меню.

PS по-моему вы принимаете за ошибку нормальное поведение :)


Название: Re: Вопрос по сигналу/слоту
Отправлено: gil9red от Август 27, 2014, 19:26
вы бы что посоветовали сделать?

Не париться :)


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Август 27, 2014, 19:55
А вы разграничьте RightClick и LeftClick и сами управляйте выделением.

А так то это нормальная ситуация - как и везде. К примеру тоталкоммандер - натыкиваем группу, потом на ещё одном правый клик - и он присоединяется к группе + меню.

PS по-моему вы принимаете за ошибку нормальное поведение :)

у меня разграничен клик левой и пкм
пкм-меню

мне нужно сделать так как я выше описал


Название: Re: Вопрос по сигналу/слоту
Отправлено: Bepec от Август 27, 2014, 19:58
У вас скорее всего разграничено поведение на левый и правый клик ПОСЛЕ обработки клика самим View :) А то, что я предлагаю - это переписать поведение view.


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Август 27, 2014, 20:00
У вас скорее всего разграничено поведение на левый и правый клик ПОСЛЕ обработки клика самим View :) А то, что я предлагаю - это переписать поведение view.

вы имеете ввиду
Код:
mousePressEvent(QMouseEvent *event)
?


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Август 27, 2014, 20:04
У вас скорее всего разграничено поведение на левый и правый клик ПОСЛЕ обработки клика самим View :) А то, что я предлагаю - это переписать поведение view.
а какой метод нужно тогда переписывать?


Название: Re: Вопрос по сигналу/слоту
Отправлено: Bepec от Август 27, 2014, 20:38
Можно не переписывать, а поставить EventFilter.
installEventFilter(QObject *) в Assistant посмотрите, пример там есть. Так же описано у Шлее в книге.


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Август 28, 2014, 11:30
Можно не переписывать, а поставить EventFilter.
installEventFilter(QObject *) в Assistant посмотрите, пример там есть. Так же описано у Шлее в книге.
Вы не могли бы пояснить что нужно написать QObject *?


Название: Re: Вопрос по сигналу/слоту
Отправлено: gil9red от Август 28, 2014, 13:17
Можно не переписывать, а поставить EventFilter.
installEventFilter(QObject *) в Assistant посмотрите, пример там есть. Так же описано у Шлее в книге.
Вы не могли бы пояснить что нужно написать QObject *?

Пользуйтесь гуглом и документацией!
QObject базовый класс почти для всех классов в Qt.
В installEventFilter(QObject *) передается указатель на класс, который наследуется от QObject (или его потомки наследуются), т.е. этот класс умеет отсылать сигналы и принимать сигналы.
В вашем же случаи нужно передать указатель на treeview. Как я помню, Q*View сами не отлавливают события от мышки, а отлавливают их viewport, потому: installEventFilter( treeview->viewport() ). Как то, так.


Название: Re: Вопрос по сигналу/слоту
Отправлено: Bepec от Август 28, 2014, 14:41
Истину глаголет сей батюшка. И да - читать надо сообщения. И читать Assistant. И понимать что там написано.


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Сентябрь 14, 2014, 15:33
так не помогает ничего...
ни так
Код:
ui->treeView->installEventFilter(ui->treeView->viewport());

ни так
Код:
installEventFilter(ui->treeView->viewport())


Название: Re: Вопрос по сигналу/слоту
Отправлено: kambala от Сентябрь 14, 2014, 19:17
в документации же четко сказано:
|объект чьи события надо ловить|->installEventFilter(|объект который ловит чужие события, т.е. в котором переопределен метод eventFilter|)


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Сентябрь 14, 2014, 21:45
Код:
menu->installEventFilter(ui->treeView->viewport());
menu-- QMenu

так тоже ничего...


Название: Re: Вопрос по сигналу/слоту
Отправлено: gil9red от Сентябрь 14, 2014, 23:33
Пример использования installEventFilter (http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter)


Название: Re: Вопрос по сигналу/слоту
Отправлено: kambala от Сентябрь 15, 2014, 00:43
ui->treeView->viewport()->installEventFilter(this);

в текущем классе переопределяешь метод eventFilter и для клика ПКМ показываешь свое контекстное меню, возвращая при этом true из eventFilter


Название: Re: Вопрос по сигналу/слоту
Отправлено: koldun90 от Сентябрь 15, 2014, 04:57
Цитировать
в текущем классе переопределяешь метод eventFilter
таким образом event filter надо определить для treeeview я правильно понял?
или нужно все таки для this?


Название: Re: Вопрос по сигналу/слоту
Отправлено: kambala от Сентябрь 15, 2014, 13:15
в this пишешь метод и в нем проверяешь чтобы объект (первый параметр метода) был тривью