2012-11-12 5 views
1

여러 곳에서이 질문을했지만 아직 이해할 수 없습니다.하드 코딩 된 바로 가기

내가하려는 일은 에 QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)을 넣고 중앙 위젯으로 QTextEdit을 사용하는 것입니다.

문제

내가 컷에 대한 shorcut ( Ctrl 키 + X)가 나는 + X Ctrl 키를 누르면, Ctrl + C가 작동하지 않는다는 것입니다. 초점이 다른 위젯에있을 때 shorcut은 완벽하게 작동합니다.

QWidget::keyPressEventQWidget::event을 무시하려고 시도했지만 동일합니다.

나는 한 번 더 질문이 : 나는이 두 쇼트 컷이있는 경우 Ctrl 키 + XCtrl 키 + XCtrl + CCtrl 키 + X을 누를 때 나는 신호 activatedAmbigiously()를받지 않습니다? Qt의 문서에 따르면

키 시퀀스가 ​​키보드로 입력 될 때, 한 더 이상의 바로 가기의 시작과 일치으로 모호한 이라고합니다.

+0

어떤 위젯이 이벤트를 삼키는 지 알 수 있습니까? – MrFox

+0

잘라 내기 작업을 실행하려고하기 때문에 QTextEdit이라고 생각합니다. – Milen

+0

그래서 Ctrl + X를 누르면 QTextEdit에서 잘라 내기 작업을 수행하지 않으시겠습니까? 아니면 자르기를 원하지만 기본 창에 keypress를 수신하도록 하시겠습니까? –

답변

0

이것은 약간의 퍼지 일지 모르지만 간단히 중앙 위젯에 이벤트 필터를 설치하고 관심있는 주요 프레스를 찾으십니까? 나에게

아래의 코드는 CTRL+X을 누르면 그것의 제한 시간에()합니다 (QMainWindowcentralWidget() 임) QTextEditcut() 이벤트를 트리거하는 타이머를 시작, 당신이 무엇을 설명 할 것으로 보인다. 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(); 
} 

이 코드는 나를 위해 작동하는 동안, 당신이하고있는 다른 것들에 방해가 거기에 가지가있을 수 있습니다. 또한 QKeySequenceactivatedAmbigiously()과 관련된 질문에 대해서는 답변하지 않습니다.

도움이 될지 알려주세요.