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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как поймать шорткат Ctrl+V and Ctrl+C в keyPressEvent( QKeyEvent * event)?  (Прочитано 11524 раз)
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« : Января 19, 2010, 21:27 »

Как поймать шорткат Ctrl+V and Ctrl+C в keyPressEvent( QKeyEvent * event)?
Шорткаты ака QShortcut не удалось приручить, мне нужно что-бы клавиатурные комбинации срабатывали только на виджете.
if (event->matches(QKeySequence::Copy))
и
if (event->matches(QKeySequence::Paste))
срабатывают только в случае (контрол|шифт)+инсерт.
А мну хочу еще контрол+(v|c)
Типа хелп Улыбающийся
Записан

@trdmval
ufna
Гость
« Ответ #1 : Января 19, 2010, 21:33 »

лови нажатие клавиши и проверяй модификатор Ctrl.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« Ответ #2 : Января 19, 2010, 21:44 »

лови нажатие клавиши и проверяй модификатор Ctrl.
проверить модификатор самое легкое Улыбающийся
Код:
	Qt::KeyboardModifiers  kbrdMod = qApp->keyboardModifiers();
bool ctrlPresed = (kbrdMod & Qt::ControlModifier) ? true : false;
Шас попробую поймать Qt::Key_V и Qt::Key_C
раньше пробовал так:
event->matches(QKeySequence::Paste);
Записан

@trdmval
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« Ответ #3 : Января 19, 2010, 21:53 »

Вот что выдает на Ctrl+X, Ctrl+C, Ctrl+V
по дебагу:
Код:
qDebug() << "ctrlPresed = true; key: " << key <<" nativeScanCode " <<event->nativeScanCode () << " text " << event->text() <<" nativeVirtualKey: "<< event->nativeVirtualKey();
Debug: ctrlPresed = true; key:  16777249  nativeScanCode  29  text  ""  nativeVirtualKey:  17
Debug: ctrlPresed = true; key:  16777249  nativeScanCode  29  text  ""  nativeVirtualKey:  17
Debug: ctrlPresed = true; key:  16777249  nativeScanCode  29  text  ""  nativeVirtualKey:  17
Фигня какая-то Грустный((((((((((
Записан

@trdmval
Akaiten
Гость
« Ответ #4 : Января 20, 2010, 09:45 »

Код
C++ (Qt)
void MainWindow::keyPressEvent(QKeyEvent *e)
{
if (e->key() == Qt::Key_C && e->modifiers() & Qt::ControlModifier)
{
qDebug() << "Ctrl+C pressed!";
}
if (e->key() == Qt::Key_V && e->modifiers() & Qt::ControlModifier)
{
qDebug() << "Ctrl+V pressed!";
}
 
QMainWindow::keyPressEvent(e);
}
 
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« Ответ #5 : Января 20, 2010, 19:02 »

Разобрался в чем дело.
У меня стояла проверка на event->isAccepted()
Почему-то в keyPressEvent( QKeyEvent * event )
она уже приходила акцептованной О_о....
Вроде не должно было быть....
Записан

@trdmval
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Января 20, 2010, 20:53 »

Разобрался в чем дело.
У меня стояла проверка на event->isAccepted()
Почему-то в keyPressEvent( QKeyEvent * event )
она уже приходила акцептованной О_о....
Вроде не должно было быть....
если в событие попали, значит событие приняли - event->isAccepted() = истинна.
Записан

Юра.
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« Ответ #7 : Января 20, 2010, 22:19 »

Разобрался в чем дело.
У меня стояла проверка на event->isAccepted()
Почему-то в keyPressEvent( QKeyEvent * event )
она уже приходила акцептованной О_о....
Вроде не должно было быть....
если в событие попали, значит событие приняли - event->isAccepted() = истинна.
неа, но возможно ты про путаешь с QObject::event() где надо true возвращать?
Впрочем пойду перечитаю про события, может чего упустил.
Записан

@trdmval
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Января 20, 2010, 22:24 »

Цитировать
Setting the accept parameter indicates that the event receiver wants the event. Unwanted events might be propagated to the parent widget. By default, isAccepted() is set to true, but don't rely on this as subclasses may choose to clear it in their constructor.
и вообще не в одном из примеров нет проверки этого флага, зачем ты эту проверку делал?
Записан

Юра.
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« Ответ #9 : Января 20, 2010, 23:16 »

Цитировать
Setting the accept parameter indicates that the event receiver wants the event. Unwanted events might be propagated to the parent widget. By default, isAccepted() is set to true, but don't rely on this as subclasses may choose to clear it in their constructor.
и вообще не в одном из примеров нет проверки этого флага, зачем ты эту проверку делал?
просто оптимизация, хотел отсеять кусок кода, если я уже отработал этот эвент.
Записан

@trdmval
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Января 20, 2010, 23:56 »

>>если я уже отработал этот эвент
если отработал выдешь из функции.
Записан

Юра.
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 866


Просмотр профиля
« Ответ #11 : Января 21, 2010, 10:17 »

>>если я уже отработал этот эвент
если отработал выдешь из функции.
Я использую несколько функций для обработки этого и не только этого эвента.
По этому и опираюсь на изАкцептид().
Записан

@trdmval
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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