Как распространить keyPressEvent на разные qt QMainWindow - PullRequest
1 голос
/ 12 октября 2010

У меня есть 2 разных QMainWindow, первое является родителем второго.Я хочу нажать несколько клавиш в дочерних окнах и распространить событие в родительском.Я создаю для каждого свою функцию void keyPressEvent (QKeyEvent * event);но когда я нажимаю клавишу для детей, событие не распространяется на родителя.Почему?

Это код ...

// Родительский класс.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QKeyEvent>
#include "test.h"
#include <QDebug>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void keyPressEvent(QKeyEvent* event);
private:
    Ui::MainWindow *ui;
    test *form;

private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

// Родительский класс.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    form = new test(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::keyPressEvent(QKeyEvent* event)
{
    qDebug() << event->text();
}

void MainWindow::on_pushButton_clicked()
{
    form->show();
}

// Children class.h

#ifndef TEST_H
#define TEST_H

#include <QMainWindow>
#include <QKeyEvent>
namespace Ui {
    class test;
}

class test : public QMainWindow
{
    Q_OBJECT

public:
    explicit test(QWidget *parent = 0);
    ~test();
protected:
    void keyPressEvent(QKeyEvent* event);
private:
    Ui::test *ui;
};

#endif // TEST_H

// Children class.cpp

#include "test.h"
#include "ui_test.h"

test::test(QWidget *parent) :  QMainWindow(parent),  ui(new Ui::test)
{
    ui->setupUi(this);
}

test::~test()
{
    delete ui;
}

void test::keyPressEvent(QKeyEvent* event)
{
  qDebug() << event->text();
  event->ignore();

}

1 Ответ

1 голос
/ 12 октября 2010

A QMainWindow - это окно верхнего уровня, где обычно заканчивается распространение события.Я не совсем понимаю, что может быть правилом, хотя, когда окно верхнего уровня является родителем.По вашим результатам, я должен предположить, что он стоит.

В любом случае вы сможете получить событие, определив метод фильтра в вашем классе MainWindow и установив его на testучебный класс.См. эту документацию .

У вас также есть возможность переопределить метод event() для QApplication.

...