Russian Qt Forum
Ноябрь 25, 2024, 04:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] отправить перехваченное событие родителю  (Прочитано 13485 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Декабрь 21, 2014, 17:46 »

Здравствуйте. Имеется QListView с кастомным делегатом, в эдиторе (persistent) которого имеется QLabel. Хочу перехватывать даблклики на QLabel и перенаправлять их в QListView (как бы даблкликать сквозь текст чтобы он не выделялся).

У лейбла установлено
Код
C++ (Qt)
label->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
чтобы можно было выделять текст мышкой, поэтому он перехватывает даблклики.

Мое решение: фильтруем события лейбла в листвью:
Код
C++ (Qt)
QWidget *FeedItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
   ImageWithLabelWidget *w = new ImageWithLabelWidget(parent);
   w->label->installEventFilter(parent->parent()); // listview
   return w;
}
 
class FeedListView : public QListView
{
protected:
   bool eventFilter(QObject *o, QEvent *e)
   {
       if (o->inherits("QLabel") && e->type() == QEvent::MouseButtonDblClick && static_cast<QMouseEvent *>(e)->button() == Qt::LeftButton)
       {
           qApp->sendEvent(this, e);
           return true;
       }
       return QListView::eventFilter(o, e);
   }
};

И тут возникает проблема: ничего не происходит когда первый раз даблкликаешь на текст, на второй и последующие разы уже все нормально. Наблюдения:
  • отсылка сообщения viewport() вместо this не помогает
  • sendEvent в обоих случаях возвращает true
  • лейбл занимает не все место эдитора. Если сперва даблкликнуть вне лейбла (отрабатывает как положено), а потом на лейбл, то срабатывает сразу
  • postEvent вместо sendEvent крашит программу
  • notify вместо sendEvent не помогает

Как чинить? Тестировал в Qt 5.3 и 5.4 на винде.

Решение состоит в отправке нужного сигнала руками (не самый лучший подход на мой взгляд):
Код
C++ (Qt)
class FeedListView : public QListView
{
protected:
   bool eventFilter(QObject *o, QEvent *e)
   {
       if (o->inherits("QLabel") && e->type() == QEvent::MouseButtonDblClick)
       {
           QMouseEvent *me = static_cast<QMouseEvent *>(e);
           if (me->button() == Qt::LeftButton)
           {
               emit doubleClicked(indexAt(me->pos()));
               return true;
           }
       }
       return QListView::eventFilter(o, e);
   }
};
« Последнее редактирование: Декабрь 23, 2014, 00:44 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 22, 2014, 14:51 »

я так понимаю желательно указать focustPolicy(Qt::StrongPolicy).
Записан
DenKor29
Гость
« Ответ #2 : Декабрь 22, 2014, 14:58 »

А что мешает на сигнал linkActivated QLabel повесить слот QListView ?
И весь код выполнить там ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Декабрь 22, 2014, 15:03 »

я так понимаю желательно указать focustPolicy(Qt::StrongPolicy).
поставил на листвью — не помогло
А что мешает на сигнал linkActivated QLabel повесить слот QListView ?
И весь код выполнить там ?

мне игнорировать надо даблклики на любой текст. ссылки-то открываются по одиночному клику.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
DenKor29
Гость
« Ответ #4 : Декабрь 22, 2014, 15:13 »

мне игнорировать надо даблклики на любой текст. ссылки-то открываются по одиночному клику.

У вас в приложении есть принципиальная разница между двойным и одиночным кликом ?
Странный интерфейс для пользователя.

Можно таймер сделать для определения времени вызова метода ....
Что то типа :

if (time==0) {time=1;return;}
//Обработка
......
time = 0;

return;


Или использовать объект QTimer (start,elapsed)

P.s переопределите mousePressEvent для QLabel в крайнем случае


« Последнее редактирование: Декабрь 22, 2014, 15:18 от DenKor29 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Декабрь 22, 2014, 15:31 »

У вас в приложении есть принципиальная разница между двойным и одиночным кликом ?
Странный интерфейс для пользователя.
да: двойной клик открывает новое окно, а одиночный ничего не делает. NoItemSelection выставлено. странного ничего не вижу.

про таймер не понял.
P.s переопределите mousePressEvent для QLabel в крайнем случае
смысл? фильтр событий же и так висит и все ловит. проблема именно в отправке события (точнее его обработке листвью).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Декабрь 22, 2014, 15:39 »

Попробуй вместо
Код
C++ (Qt)
qApp->sendEvent(this, e);
это
Код
C++ (Qt)
e->ignore();
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Декабрь 22, 2014, 19:25 »

ни ignore ни accept не помогают.

если сперва сделать одиночный клик, а потом двойной, то не срабатывает все равно.

есть подозрение, что надо принудительно делать setCurrentIndex перед отправкой сообщения. буду пробовать.
« Последнее редактирование: Декабрь 22, 2014, 19:27 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 22, 2014, 19:39 »

kambala, помоему ты зря во вюхе проблему решаешь.
Если описанное поведение - особенность делегата, то в нём и нужно всё разруливать.

А то фильтр событий ты устанавливаешь в делегате, а сам фильтр находится во вюхе.
Да и зачем фьюхе пересылать событие, которое предлагается игнорировать
Записан

Юра.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Декабрь 22, 2014, 19:57 »

вьюха должна перехватить событие (чтобы отработал QListView::doubleClicked), поэтому в нее и пересылаю.

к тому же, делегатов много создается в памяти, а вьюха лишь одна.

P.S. setCurrentIndex не помогает тоже.
« Последнее редактирование: Декабрь 22, 2014, 20:11 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Декабрь 22, 2014, 23:23 »

Так а если есть возможность в делегате отлов производить, быть может, пусть делегат эмитит сигнал какой-нибудь, который будет перехватываться вьюхой?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Декабрь 23, 2014, 00:37 »

ну остается только руками пускать сигнал (это работает) вместо пересылки события. я надеялся на более «чистое» решение Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Akon
Гость
« Ответ #12 : Декабрь 23, 2014, 01:02 »

А попробуй в твоем исход. вар-те:
Код:
qApp->postEvent(this, e->clone());
Конечно, e->clone() нет, но смысл, думаю, понятен.
Записан
Akon
Гость
« Ответ #13 : Декабрь 23, 2014, 01:10 »

Цитировать
И тут возникает проблема: ничего не происходит когда первый раз даблкликаешь на текст, на второй и последующие разы уже все нормально.
Может, как то фокус ввода тут замешан? ... focustPolicy(Qt::StrongPolicy) на лейбл.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Декабрь 23, 2014, 01:23 »

А попробуй в твоем исход. вар-те:
Код:
qApp->postEvent(this, e->clone());
Конечно, e->clone() нет, но смысл, думаю, понятен.

с sendEvent/postEvent ничего не происходит. если «постануть» ивент, созданный на стеке, то приложение зависает.
Цитировать
И тут возникает проблема: ничего не происходит когда первый раз даблкликаешь на текст, на второй и последующие разы уже все нормально.
Может, как то фокус ввода тут замешан? ... focustPolicy(Qt::StrongPolicy) на лейбл.

не помогло тоже
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.219 секунд. Запросов: 23.