crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AD
  опции профиля:
сообщение 14.7.2008, 15:42
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Как правильно обрабатывать сочетания клавиш в функции keyPressEvent()? Например сочетания: Alt+Enter, Alt+y, etc!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 11)
void*
  опции профиля:
сообщение 14.7.2008, 16:16
Сообщение #2


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


void YourWidget::keyPressEvent(QKeyEvent *event) {
         switch(event->key()) {
              case Qt::Key_S:
                               if(event->modifiers() & Qt::ShiftModifier) {
                                                                  //было нажато сочетание Shift + S
                               }
                               else if(event->modifiers() & Qt::CTRL) {
                                                                  //было нажато сочетание Ctrl + S
                               }
              default:
                               QWidget::keyPressEvent(event); //иначе передаем событие дальше
        }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.7.2008, 16:27
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


void*, спасибо! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 14.7.2008, 16:59
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


Проще QAction использовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 14.7.2008, 17:20
Сообщение #5


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


возможно в некоторых случаях и удобнее, пример:
QAction *act = new QAction("text");
act->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); //так называемые горячие клавиши
connect(act, SIGNAL(triggered()), pointer, SLOT(someSlot())); //итого: при нажатии комбинации Ctrl + S выполнится слот someSlot() объекта на который указывает pointer
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.7.2008, 17:30
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Стоп! Вот эта новость! А разве QAction не связан с панелью меню? Разве его можно использовать отдельно от панели меню????
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 14.7.2008, 20:51
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


Естественно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 14.7.2008, 20:54
Сообщение #8


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


AD, и еще таким образом можно сделать в программе тайные (недокументированные) функции, которые работают только при нажатии определенной комбинации клавиш :)

Сообщение отредактировал void* - 14.7.2008, 20:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.7.2008, 10:20
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(void* @ 14.7.2008, 21:54) *
AD, и еще таким образом можно сделать в программе тайные (недокументированные) функции, которые работают только при нажатии определенной комбинации клавиш :)

Ну выношу в топик. Вариант с keyPressEvent работает. А вот с QAction что-то не получилось! Поэтому, кто знает в чем может глюк, помогите, пожалуйста.
Код такой:
QAction* act = new QAction("test", this);
act -> setShortcut(QKeySequence(Qt::ALT + Qt::Key_X));
connect(act, SIGNAL(triggered()), this, SLOT(close()));

Делаю эти действия в конструкторе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 15.7.2008, 13:45
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


QAction* act = new QAction("test", this);
act -> setShortcut(QKeySequence(Qt::ALT + Qt::Key_X));
connect(act, SIGNAL(triggered()), this, SLOT(close()));
addAction(act);

либо можно QShortcut еще использовать, там практически тоже самое, только addAction делать не нужно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.7.2008, 14:36
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


А вот этот вариант заработал :)

QAction* act = new QAction("test", this);
act -> setShortcut(QKeySequence(Qt::ALT + Qt::Key_X));
connect(act, SIGNAL(triggered()), this, SLOT(close()));
addAction(act);


Red Devil, thank you! :)


Цитата(Red Devil @ 15.7.2008, 14:45) *
либо можно QShortcut еще использовать, там практически тоже самое, только addAction делать не нужно.

А можно тоже пример кода, а то как и в пред. случае будет ошибка, что строчку забыли! :) Жду примерчик! :blush2:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 15.7.2008, 15:55
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


Функция класса, в котором создаются shortcuts. У меня такой класс один, если их более одного, то еще не помешало бы вынести функцию отдельно и добавить параметр QObject * pSender, и заменить его там где this.
void CreateShortcut( QShortcut *& pShortcut, const char * sName, const char * sShortcut, const char * sHandler, Qt::ShortcutContext Context = Qt::WindowShortcut)
{
    pShortcut = new QShortcut(QKeySequence(tr(sShortcut)), this);
    pShortcut->setWhatsThis(tr(sName));
    pShortcut->setContext(Context);
    connect(pShortcut, SIGNAL(activated()), this, sHandler);
}

Добавление, где-то при инициализации приложения :
// обьявление 
QShortcut * m_pShortcut1;
QShortcut * m_pShortcut2;
...
// инициализация (в конструкторе например)
CreateShortcut(m_pShortcut1, "Shortcut 1", "Ctrl+S", SLOT(Shortcut1Slot()));
CreateShortcut(m_pShortcut2, "Shortcut 2", "Ctrl+D", SLOT(Shortcut2Slot()));


Сообщение отредактировал Red Devil - 15.7.2008, 15:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.6.2025, 15:18