2016-03-15 3 views
0

J'ai donc QMainWindow classe de type qui décrit par le code suivant:Comment empêcher les objets QWidgets ou QDialog de prendre en charge des événements clés à partir de QMainWindow une fois que la boîte de dialogue a été cliquée par la souris?

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    void closeEvent(QCloseEvent *);\ 
    DimensionDialog *newResolution; 
    Ui::MainWindow *ui; 
    ImageInteraction *liveVideo; 
    ImageInteraction *modifiedVideo; 
    CameraControl *cameraControl; 
    QPushButton *pushToTalk; 
    QPushButton *audioSettingsSetup; 
    AudioSettings *audioSettings; 
    QPushButton *numberOfRunningThreads; 

protected: 
    void keyPressEvent(QKeyEvent * event); 
    void keyReleaseEvent(QKeyEvent * event); 

private slots: 
    void restartVideoWithNewResolution(int, int); 
}; 

De là, vous pouvez voir que cette classe ne gère certains événements clés.

Comme vous pouvez le voir, cette classe a également des membres DimensionDialog et CameraControl, qui sont respectivement QDialog et QWigdet classes de type. Maintenant, ces deux membres ont aussi leurs propres emplacements, qui sont appelés lorsque certains boutons sont enfoncés. Le problème est que lorsque l'un de ces boutons est enfoncé, la classe correspondante (DimesionDialog ou CameraControl) prend en charge les événements de clé et la classe MainWindow ne peut plus saisir les événements de clé.

Je n'arrive pas à comprendre pourquoi cela se passe. Comment puis-je empêcher cela? Je veux que l'événement clé soit géré uniquement par le MainWindow.

Merci.

+0

Avez-vous joué avec grabKeyboard? http://doc.qt.io/qt-4.8/qwidget.html#grabKeyboard – bibi

+0

merci, je ne savais pas à ce sujet. Ça aide. –

+0

Utilisez [installEventFilter] (http://doc.qt.io/qt-4.8/qobject.html#installEventFilter) pour empêcher la boîte de dialogue de recevoir cet événement, puis de l'envoyer à votre fenêtre principale. – Zen

Répondre

-1

Si vous souhaitez propager un événement clé au parent, vous devez l'ignorer explicitement.

void DimensionDialog:keyPressEvent(QKeyEvent *event) 
{ 
    // ... 
    // do something then propagate event to parent 
    event->ignore(); 
} 

C'est le comportement de QEvent. Donc, pour les événements souris, cela devrait aussi fonctionner. Si vous avez besoin de détecter des événements clés globalement dans l'application entière, vous pouvez les capturer et les traiter dans QApplication :: notify() réimplémenté (pour plus de détails comment utiliser QCoreApplication :: notify() voir Qt docs sur cela) .

class KeyEventAwareApp : public QApplication 
{ 
    public: 
    using QApplication::QApplication; 

    bool notify(QObject* object,QEvent* event) 
    { 
     if(event->type() == QEvent::KeyPress) 
     { 
     // do any event processing here, for example redirect it to other object 
     // if swallow event then 
     return true; 
     // otherwise send event to the receiver 
     return object->event(event); 
     } 
     // we are interested only in key events, so forward the rest to receivers 
     return object->event(event); 
    } 
}; 
+0

J'ai essayé ça, ça ne marche pas. grabKeyboard uniquement pour avoir le contrôle du clavier avec MainWindow, mais les événements clés ne fonctionnent pas pour les autres widgets lorsqu'ils sont ouverts en haut de MainWindow. –

+0

Je vois. DimensionDialog peut être une fenêtre de niveau supérieur plutôt qu'un enfant de QMainWIndow, la propagation d'événement ne fonctionnera pas. Ensuite, vous devez saisir les événements clés au niveau QApplication, puis les envoyer pour traitement à certaines de vos méthodes dans votre fenêtre principale. Je vais éditer le post. –