2012-11-12 32 views
1

我在幾個地方問過這個問題,但我仍然無法弄清楚。硬編碼快捷鍵

我想要做的是在MainWindow中使用QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)QTextEdit作爲中心控件。

的問題是,我有一個切shorcut(按Ctrl + X),當我按下按Ctrl + X按Ctrl + C這是行不通的。當焦點位於不同的部件上時,shorcut完美地工作。

我試着重寫QWidget::keyPressEventQWidget::event但它是一樣的。

我有一個問題:如果我有這兩個shorcuts 按Ctrl + X按Ctrl + X按Ctrl + C爲什麼當我按下按Ctrl + X我沒有收到信號activatedAmbigiously()?據Qt文檔:

當一個鍵序列被從鍵盤輸入,它被認爲是 曖昧只要超過一個快捷方式的開始相匹配。

+0

你可以告訴哪個小部件最終吞嚥事件嗎? – MrFox

+0

我認爲這是QTextEdit,因爲它試圖運行切割動作。 – Milen

+0

因此,按下Ctrl + X時,您不希望QTextEdit執行剪切操作?或者你想讓它做切割,但也有主窗口接收按鍵? –

回答

0

這可能有點兒糊塗,但是不能只是在中央小部件上安裝事件過濾器並查找您感興趣的按鍵嗎?

下面的代碼,我似乎做你的描述,如果按CTRL+X它啓動一個計時器,在其超時()將觸發對QTextEdit一個cut()事件(這是QMainWindowcentralWidget())。如果另一個關鍵事件帶有CTRL+CCTRL+X標誌仍處於活動狀態,則會觸發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()的任何問題。

讓我知道這是否有幫助。