Так что я QMainWindow
Тип класса, который описывается следующим кодом:
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);
};
Оттуда вы можете видеть, что этот класс обрабатывает некоторые ключевые события.
Как вы можете видеть, этот класс также имеет членов DimensionDialog
а также CameraControl
, которые соответственно QDialog
а также QWigdet
Типы классов. Теперь у этих двух членов также есть свои собственные слоты, которые вызываются при нажатии определенных кнопок. Проблема в том, что при нажатии одной из этих кнопок соответствующий класс (либо DimesionDialog
или же CameraControl
) принимает на себя ключевые события и MainWindow
класс не может поймать больше ключевых событий.
Я не могу понять, почему это происходит. Как мне это предотвратить? Я хочу, чтобы ключевое событие обрабатывалось только MainWindow
,
Благодарю.
Если вы хотите передать ключевое событие родительскому событию, вы должны явно игнорировать его.
void DimensionDialog:keyPressEvent(QKeyEvent *event)
{
// ...
// do something then propagate event to parent
event->ignore();
}
Это поведение QEvent. Таким образом, для событий мыши это должно работать также.
Если вам нужно глобально обнаруживать ключевые события во всем приложении, вы можете перехватить и обработать их в переопределенной QApplication :: notify () (более подробную информацию о том, как использовать QCoreApplication :: notify (), смотрите в документации по Qt).
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);
}
};
Других решений пока нет …