• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Qt-przechwytywanie znaków z klawiatury

Object Storage Arubacloud
0 głosów
285 wizyt
pytanie zadane 20 kwietnia 2019 w C i C++ przez JuniorPL Użytkownik (770 p.)
edycja 20 kwietnia 2019 przez JuniorPL

Cześć tworzę prostą grę z wykorzystaniem QT, wczoraj natknąłem się na pewną trudność. Stworzyłem metodę która będzie odpowiadać za sprawdzanie jaki znak użytkownik wybrał ale nie potrafię jej wywołać.

#<span style="color:#000080">include</span><span style="color:#c0c0c0"> </span><span style="color:#008000">"mainwindow.h"</span>

#include <QApplication>

#include "QKeyEvent"

#include <QtGui>

#include "keypress.h"

#include <QApplication>

#include <QDebug>

#include <QGraphicsPixmapItem>


class Item: public QObject, public QGraphicsPixmapItem

{

    public:

void keyPressEvent(QKeyEvent *event);

};



    void Item::keyPressEvent(QKeyEvent *event)

    {


       if(event->key() == Qt::Key_Left)

       {

        qDebug() <<"klikniete";

       }

    }



int main(int argc, char *argv[])

{

    QApplication a(argc, argv);


   Item * item;


   item->keyPressEvent(//brak argumentu);





    return a.exec();

}

Cała trudność polega na przechwyceniu zdarzenia może ktoś coś podpowie jak przechwycić to zdarzenie.

komentarz 20 kwietnia 2019 przez Secrus Nałogowiec (32,880 p.)
Po co aż tyle pustych linii? PS klawiatury, nie klawiatóry
komentarz 20 kwietnia 2019 przez JuniorPL Użytkownik (770 p.)
Pszepraszam za pomyłkę, już poprawione.
komentarz 20 kwietnia 2019 przez j23 Mędrzec (194,920 p.)

@JuniorPL, nie powinieneś przypadkiem obiektu item dodać do obiektu klasy QGraphicsScene podpiętego do obiektu QGraphicsView?

1 odpowiedź

+1 głos
odpowiedź 21 kwietnia 2019 przez Bondrusiek Maniak (61,370 p.)

Witam,

pokaże Ci jak przykładowo stworzyć taki kody, który chcesz. Tak na zachęte

#include <QApplication>
#include <QObject>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QKeyEvent>
#include <QPainter>
#include <QGraphicsPixmapItem>
#include <QDebug>

class Item: public QObject, public QGraphicsPixmapItem

{
public:

void keyPressEvent(QKeyEvent *event);

// QGraphicsItem interface
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

void Item::keyPressEvent(QKeyEvent *event)
{
      if(event->key() == Qt::Key_Left)
       {
            qDebug() <<"klikniecie lewej strzałki";

       }
      QGraphicsPixmapItem::keyPressEvent(event);
}

void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setBrush(QBrush(Qt::red));
    painter->drawRect(QRectF(0,0,20,20));
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsView *view = new QGraphicsView();
    QGraphicsScene *scene = new QGraphicsScene();
    scene->setSceneRect(QRectF(0,0,800,600));
    view->setScene(scene);

    Item* myItem = new Item();
    myItem->setPos(200, 200);
    myItem->setFlag(QGraphicsItem::ItemIsFocusable);
    myItem->setFocus();
    scene->addItem(myItem);

    view->show();


    return a.exec();
}

Tak na początek:

1) Musisz poprawić dołączanie bibliotek

2) Formatowanie kodu

3)Dzielenie projektu na np klasy

4) Zapoznanie sie z wskaźnikami

Zapoznaj się z frameworkiem, który udostępnia Qt aby lepiej zrozumieć zasadę działanie : sceny, widoku czy itemu : https://doc.qt.io/archives/qt-4.8/graphicsview.html lub https://www.youtube.com/watch?v=b35JF4LqtBs&list=PUYP0nk48grsMwO3iL8YaAKA&index=11.

komentarz 22 kwietnia 2019 przez JuniorPL Użytkownik (770 p.)

Gdzieś chyba zrobiłem błąd albo źle to zrozumiałem:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsView *view = new QGraphicsView();    
    
    Item* myItem = new Item();
    myItem->setRect(0,0,100,100);
    myItem->setPos(200, 200); 

    Item* enemyItem = new Item();
   enemyItem->setRect(200,200,100,100);
    enemyItem->setPos(100, 100);
    
    Scene *scene = new Scene(myItem,enemyItem);
    scene->setSceneRect(QRectF(0,0,800,600));
   
    scene->addItem(myItem);
 scene->addItem(enemyItem);
//Error
 //no member 'setFlag' in 'Scene'
 scene->setFlag(QGraphicsItem::ItemIsFocusable);
  scene->setFocus();
view->setScene(scene);
 view->show();

    return a.exec();
}

 

komentarz 23 kwietnia 2019 przez Bondrusiek Maniak (61,370 p.)
setFlag() używasz dla itemu nie dla sceny.
komentarz 23 kwietnia 2019 przez JuniorPL Użytkownik (770 p.)

Nie wiem czy to tak powinno wyglądać ale po kompilacji i uruchomieniu metoda sterująca nie jest w ogóle wywoływana. Masz może jakiś pomysł co może być tego przyczyną?

#include <QApplication>
#include <QObject>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QKeyEvent>
#include <QPainter>
#include <QGraphicsPixmapItem>
#include <QDebug>
#include <QGraphicsRectItem>
#include <QThread>

class Item: public QObject, public QGraphicsRectItem
{
public:
int gammerMove;
void keyPressEvent(QKeyEvent *event);
int gammerMoveGet();
};

void Item::keyPressEvent(QKeyEvent *event)
{
      if(event->key() == Qt::Key_Left)
       {
         setPos(x()-5,y());
       }
      if(event->key() == Qt::Key_Right)
       {
         setPos(x()+5,y());
       }
      if(event->key() == Qt::Key_Up)
       {
         setPos(x(),y()-5);
       }
      if(event->key() == Qt::Key_Down)
       {
       setPos(x(),y()+5);
       }


       qDebug() << "gammerMove";

}

int Item::gammerMoveGet()
{
    return gammerMove;
}

class Scene : public QGraphicsScene
{
public:
   Item *leftPlayer;
   Item *rightPlayer;

    Scene(Item *_leftPlayer,Item *_rightPlayer)
    {
        leftPlayer=_leftPlayer;
       rightPlayer=_rightPlayer;

    }
    void keyPressEvent(QKeyEvent *event);
};
void Scene::keyPressEvent(QKeyEvent *event)
{
      if(event->key() == Qt::Key_Space)
       {
        clearFocus();
       }
       if(event->key() == Qt::Key_A)
       {
        leftPlayer->setFocus();
       }
       if(event->key() == Qt::Key_B)
       {
       leftPlayer->setFocus();
       }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsView *view = new QGraphicsView();    

    Item* myItem = new Item();
    myItem->setRect(0,0,100,100);
    myItem->setPos(200, 200);

    Item* enemyItem = new Item();
   enemyItem->setRect(200,200,100,100);
    enemyItem->setPos(100, 100);

    Scene *scene = new Scene(myItem,enemyItem);
    scene->setSceneRect(QRectF(0,0,800,600));

    scene->addItem(myItem);
    scene->addItem(enemyItem);
    myItem->setFlag(QGraphicsItem::ItemIsFocusable);
    enemyItem->setFlag(QGraphicsItem::ItemIsFocusable);
    scene->setFocus();
    view->setScene(scene);
    view->show();

    return a.exec();
}

 

komentarz 23 kwietnia 2019 przez Bondrusiek Maniak (61,370 p.)

Wydaje mi się że źle obsługujesz eventy tzn musisz jeszcze dodać domyślną obsługę aby event rozszedł się do rodziców oraz dzieci.

void Item::keyPressEvent(QKeyEvent *event)
{
      if(event->key() == Qt::Key_Left)
       {
         setPos(x()-5,y());
       }
      if(event->key() == Qt::Key_Right)
       {
         setPos(x()+5,y());
       }
      if(event->key() == Qt::Key_Up)
       {
         setPos(x(),y()-5);
       }
      if(event->key() == Qt::Key_Down)
       {
       setPos(x(),y()+5);
       }
 
 
       qDebug() << gammerMove; // bez cudzysłowie wyświetli wartość a nie string
//Obsługa dla QGraphicsRectItem
       QGraphicsRectItem::keyPressEvent(event);
}
 
void Scene::keyPressEvent(QKeyEvent *event)
{
      if(event->key() == Qt::Key_Space)
       {
        clearFocus();
       }
       if(event->key() == Qt::Key_A)
       {
        leftPlayer->setFocus();
       }
       if(event->key() == Qt::Key_B)
       {
       leftPlayer->setFocus();
       }
//Obsługa dla QGraphicsScene
       QGraphicsScene::keyPressEvent(event);
}

Więcej info:

https://doc.qt.io/qt-5/eventsandfilters.html

komentarz 23 kwietnia 2019 przez JuniorPL Użytkownik (770 p.)
Wileki dzieki za pomoc, problem z którym zmagałem się dłuższy czas został rozwiązany.

Podobne pytania

0 głosów
1 odpowiedź 1,648 wizyt
pytanie zadane 22 stycznia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 20 sierpnia 2017 w Systemy operacyjne, programy przez Sati Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 86 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...