Как предотвратить членские объекты QWidgets или QDialog, принимающие ключевые события из QMainWindow после щелчка мышью по диалогу?

Так что я 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,

Благодарю.

0

Решение

Если вы хотите передать ключевое событие родительскому событию, вы должны явно игнорировать его.

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);
}
};
-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]