이것은 약간의 퍼지 일지 모르지만 간단히 중앙 위젯에 이벤트 필터를 설치하고 관심있는 주요 프레스를 찾으십니까? 나에게
아래의 코드는 CTRL+X
을 누르면 그것의 제한 시간에()합니다 (QMainWindow
의 centralWidget()
임) QTextEdit
에 cut()
이벤트를 트리거하는 타이머를 시작, 당신이 무엇을 설명 할 것으로 보인다. CTRL+X
플래그가 계속 활성화되어있는 동안 다른 키 이벤트가 CTRL+C
과 함께 오면 close()
이 트리거됩니다.
mainwindow.h
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include "ui_mainwindow.h"
#include <QTimer>
class MainWindow: public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
virtual bool eventFilter(QObject *obj, QEvent *event);
public slots:
void passOnEvent();
private:
QTimer *timer;
bool xactive;
};
#endif
mainwindow.cc
#include "mainwindow.h"
#include <QMouseEvent>
#include <QKeyEvent>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), timer (new QTimer), xactive(false)
{
setupUi(this);
centralWidget()->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(obj != centralWidget()) {
return QObject::eventFilter(obj, event);
} else if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_X && keyEvent->modifiers() == Qt::ControlModifier) {
timer->start(250);
connect(timer,SIGNAL(timeout()),this,SLOT(passOnEvent()));
xactive = true;
return true;
} else if(xactive && keyEvent->key() == Qt::Key_C && keyEvent->modifiers() == Qt::ControlModifier) {
this->close();
return true;
} else {
return QObject::eventFilter(obj, event);
}
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
void MainWindow::passOnEvent()
{
xactive = false;
timer->stop();
static_cast<QTextEdit*>(centralWidget())->cut();
}
이 코드는 나를 위해 작동하는 동안, 당신이하고있는 다른 것들에 방해가 거기에 가지가있을 수 있습니다. 또한 QKeySequence
및 activatedAmbigiously()
과 관련된 질문에 대해서는 답변하지 않습니다.
도움이 될지 알려주세요.
어떤 위젯이 이벤트를 삼키는 지 알 수 있습니까? – MrFox
잘라 내기 작업을 실행하려고하기 때문에 QTextEdit이라고 생각합니다. – Milen
그래서 Ctrl + X를 누르면 QTextEdit에서 잘라 내기 작업을 수행하지 않으시겠습니까? 아니면 자르기를 원하지만 기본 창에 keypress를 수신하도록 하시겠습니까? –