Poblem bei KeyPressEvent



  • Hallo zusammen!

    ich bin ein qt-änfanger und habe eben mein erste Programm zum Laufen gekrieget .
    ich habe ein Sinusfunktion geplottet und hat wunderbar geklappt aber ich hab noch ein Problem die Window zuschließen. ich versucht mit Hilfe der Methode KeyPressEvent das Qwidget zu schließen wenn ich Esc-taste drücke :
    hier sind Abschnitte von meinem Code

    parser.h

    class Parser: public QWidget{       
    
     public:
    
      Parser(int n, QWidget *p=NULL,Qt::WindowFlags f=0);
      void setValue( const std::vector<xyvalues> &v);   
    
     protected:
    
      virtual void paintEvent( QPaintEvent *ev);
      virtual void KeyPressEvent( QKeyEvent *event);
    

    parser.cpp

    void Parser::KeyPressEvent(QKeyEvent* event){
    
      if(event ->  Key()== Qt::Key_Escape)
        {
          event->accept();
          close();
        }
      else{
        Parser::KeyPressEvent(event);
      }
    }
    

    main.cpp

    QApplication myapp(argc, argv);
     xyvalues v;
     Parser* pWindow = new Parser (psize);
      pWindow->resize(psize,psize);
      for(i=0; i<=psize-1; i++){
       v.x= i*0.01;
       v.y= sin(v.x);
       pWindow->setValue(i, v);
     }
      pWindow->show();
      return myapp.exec();
    
    }
    

    Compilermeldung:

    error: invalid use of incomplete type ‘struct QKeyEvent’
    /usr/include/qt4/QtGui/qwidget.h:79:7: error: forward declaration of ‘struct QKeyEvent’
    parser.cpp:549:12: error: invalid use of incomplete type ‘struct QKeyEvent’
    /usr/include/qt4/QtGui/qwidget.h:79:7: error: forward declaration of ‘struct QKeyEvent’
    

    ich bin für jeder Hilfe sehr Dankbare

    Gruß
    seb



  • Der Compiler hat dort nur die Forward-Deklaration der Klasse QKeyEvent - das reichte ihm für die Deklaration der Methoden, die einen Event als Parameter erwarten, aber nicht um diesen Parameter tatsächlich nutzen zu können. Dafür benötigst du in der parser.cpp ein #include <qkeyevent.h> (oder in welchem Header die Klasse definiert ist).

    PS: Dir ist schon klar, daß du in der Parser::KeyPressEvent() eine Endlos-Rekursion eingebaut hast? Im else-Zweig solltest du die Methode der Basisklasse aufrufen und nicht dich selber.



  • habe #include <qkeyevent.h> zu Header zugefügt; der Compler meledt kein Fehler mehr aber das fenster schließt nicht wenn ich Esc -taste drück und habe
    parser.cpp so gändert:

    void Parser::KeyPressEvent(QKeyEvent* event){
    
      if(event->key()== Qt::Key_Escape)
        {
          event->accept();
          close();
    
        }
      else{
        // Parser::KeyPressEvent(event);
         KeyPressEvent(event);
      }
       }
    


  • Der Compiler findet die Methode nicht

    void Parser::keyPressEvent(QKeyEvent* event){
    
      if(event->key()== Qt::Key_Escape)
        {
          event->accept();
          close();
    
        }
      else{
    
         keyPressEvent();
      }
       }
    

    kannst du mir vieleich sagen wie ich das endlose schleife beheben kann



  • void Parser::keyPressEvent(QKeyEvent *event)
    {
        if (event->key() == Qt::Key_Escape)
        {
            event->accept();
            close();
        } else {
            QWidget::keyPressEvent(event);
        }
    }
    


  • Danke holzeimer;
    es hat jetzt geklappt aber anscheined das Pr0gramm lauft immer noch im Hintergrund; zwar wenn ich die Ecs drücke ,schließt das fenseter aber das Programm bleibt irgenwo immer noch hängen



  • Es hat geklappt;

    Danke euch alle



  • Es hat geklappt;

    Danke euch alle


Anmelden zum Antworten