Zdarzenie Qt - Reakcja na wciśnięcie kilku klawiszy.

0

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ąć?

0

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

0

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).

0

Ogólnie dążę do tego, aby po wciśnięciu jednocześnie klawisza "a" oraz "1" została wywołana moja funkcja.

0

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.

0

Czyli skrót np "Ctrl + O" klawiatura jest w stanie obsłużyć bez problemu a inne typu "a + z" już nie?

0
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.

1

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;
    }
}
0

Dzięki, o to mi chodziło, jak widać nie ma rzeczy niemożliwych ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1