2017-02-08 56 views
1

我正在將程序從Qt4移植到Qt5。我已經達到了編譯這兩個版本的程度。幾乎一切似乎都在新版本中的工作,除外,我已經失去了在QT5版本Ctrl+U鍵盤快捷鍵在兩個不同的上下文:在對話框中從Qt4移植到Qt5時Ctrl + U組合鍵丟失

  • ,使用分配給Ctrl+U鍵序列QShortcut
  • 當在事件過濾器中偵聽事件時,在主窗口中輸入

這似乎特定於Ctrl+U。我知道在對話框中,其他快捷方式(如Ctrl+FCtrl+W)與以前一樣工作,而在主窗口中,Ctrl+P也可以像以前一樣工作。

Qt5中有什麼特別的Ctrl+U(可能還有其他的)阻止我看到該事件?

編輯

似乎它與一個行編輯的存在。 MWE:

#include "mw.hh" 
#include <QApplication> 
#include <QShortcut> 
#include <QStatusBar> 
#include <QKeySequence> 
#include <QTextStream> 
#include <QLineEdit> 


static void registerShortCut(const QKeySequence & seq, QWidget * receiver, 
          const char * fn, 
          Qt::ShortcutContext context = Qt::WindowShortcut) 
{ 
    QShortcut * sc = new QShortcut(seq, receiver); 
    sc->setContext(context); 
    receiver->connect(sc, SIGNAL(activated()), fn); 
} 

MW::MW() 
{ 
    statusBar()->showMessage("stuff"); 
    registerShortCut(QKeySequence(tr("Ctrl+T")), 
        this, SLOT(test())); 
    registerShortCut(QKeySequence(tr("Ctrl+U")), 
        this, SLOT(test2())); 

    QLineEdit * le = new QLineEdit("stuff"); 
    setCentralWidget(le); 
} 

void MW::test() 
{ 
    statusBar()->showMessage("Test !"); 
} 

void MW::test2() 
{ 
    statusBar()->showMessage("Test 2 !"); 
} 

int main(int argc, char ** argv) 
{ 
    QApplication main(argc, argv); 
    MW mw; 
    mw.show(); 
    main.exec(); 
} 

隨着mw.hh

#include <QMainWindow> 

class MW : public QMainWindow { 
    Q_OBJECT; 
public: 
    MW(); 

public slots: 
    void test(); 
    void test2(); 
}; 

擊中Ctrl+T測試顯示在狀態欄,但Ctrl+U沒有。註釋掉setCentralWidget(le)行可恢復預期行爲。

+1

你明白,說的快捷方式被定義多次任何日誌消息?如果發生這種情況,快捷方式將被禁用。既不分配它的地方也可以工作。 – goug

+0

@goug不,我沒有這些。而且,在兩種情況中的一種情況下,我沒有使用快捷方式,只是攔截事件。 –

+0

聽起來好像是在Ctrl-U到達應用程序或對話框之前攔截了Ctrl-U。 Ctrl-U是對話框系統菜單上的一個快捷方式,還是沿着這些方向? (你還沒有說過你在使用什麼平臺。)你是否在同一個盒子上同時運行Qt4版本和Qt5版本,但獲得這些不同的結果? – goug

回答

0

我無法找到問題的根源,尤其是因爲Ctrl+U未被引用爲QLineEdit中的鍵盤快捷鍵。不過,我發現了一個很好的解決方法,靈感來自this answer。我下面的代碼添加到我自己的QApplication子類:

bool notify(QObject * receiver, QEvent * event) 
    { 
    // We override keyboard shortcuts within QLineEdit 
    if(event->type() == QEvent::ShortcutOverride && 
     dynamic_cast<QLineEdit*>(receiver)) { 
     event->ignore(); 
     return false; 
    } 
    return QApplication::notify(receiver, event); 
    }