Udało mi się napisać program, który reaguje na wciśnięcie 2 klawiszy np ctrl + a, jednak nie jestem w stanie napisać programu, który reagował by na wciśnięcie klawiszy np: a+1, k+z itd... Czy ktoś orientuje się, w jaki sposób mogę to osiągnąć?
w samym Qt chyba nie ma zaimplementowanego sprawdzania stanu konkretnego klawisza
co oznacza, ze bedziesz musial skorzystac z funkcji jakie daje konkretna platforma
przykladowo w winzgrozie jest to GetKeyState() i GetKeyboardState() ( windows.h )
czyli dla kombinacji a+s w obsludze QKeyEvent spowodowanego nacisnieciem klawisza s sprawdzal bym czy jest wcisniety klawisz a
opisz dokładniej w czym problem! Co rozumiesz przez "a+1" "k+z"?
Najprawdopodobniej musisz zmienić zachowanie klawiatury, nadpisując metody keyPressEvent i keyReleaseEvent dla QWidget.
Tam obserwując zmiany stany klawiatury możesz odkryć moment równoczesnego wciśnięcia dowolnych klawiszy.
Popatrz też na QKeySequence (może akurat wystarczy).
Ogólnie dążę do tego, aby po wciśnięciu jednocześnie klawisza "a" oraz "1" została wywołana moja funkcja.
Klawiatura raczej nie jest przystosowana do takich dziwolągów, może być problem z odebraniem niektórych kombinacji nawet jeśli zrobi się to dobrze.
Czyli skrót np "Ctrl + O" klawiatura jest w stanie obsłużyć bez problemu a inne typu "a + z" już nie?
z1 napisał(a):
Czyli skrót np "Ctrl + O" klawiatura jest w stanie obsłużyć bez problemu a inne typu "a + z" już nie?
dokładnie tak bo ctrl to klawisz "modyfikujący" standardowe przeznaczenie pozostałych klawiszy. Podobnie jak Shift, Alt, Command itd.
jakoś się z wami nie zgodzę, to działa tak jak sobie życzy @z1:
#include<QKeyEvent>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setFocusPolicy(Qt::ClickFocus);
grabKeyboard();
keyA=keyI=false;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::keyPressEvent(QKeyEvent *e)
{
switch(e->key()) {
case Qt::Key_A:
ui->label->setText(keyI?"A and I is pressed":"A is pressed");
keyA = true;
break;
case Qt::Key_I:
ui->label_2->setText(keyA?"I and A is pressed":"I is pressed");
keyI = true;
break;
}
}
void MainWindow::keyReleaseEvent(QKeyEvent *e)
{
switch(e->key()) {
case Qt::Key_A:
ui->label->setText("relesed A");
keyA = false;
break;
case Qt::Key_I:
ui->label_2->setText("relesed I");
keyI = false;
break;
}
}
Dzięki, o to mi chodziło, jak widać nie ma rzeczy niemożliwych ;p