2012-08-30 157 views
8

我深入到建設一個桌面應用程序與QML和Qt Creator和我目前正在研究的鍵盤操作以及它如何與QML元素的作品。我已經意識到缺少適用於桌面小部件的QML替代品。分配鍵盤快捷鍵QML組件

我現在的問題是,我希望分配一些全局鍵盤快捷鍵來一些特別的QML組件(如分配鍵盤快捷鍵來在GUI上的按鈕),這應該激活它們。我可以管理最好是用FocusScopes和鍵導航,以便能夠通過鍵盤只是導航界面,但這是不一樣的東西。

任何人都可以表明,在這種情況下怎麼辦? Qt 5有沒有這樣的功能?我無法在互聯網上找到關於此的任何信息。

+0

試試這個QShortcut http://doc.qt.nokia.com/4.7-snapshot/qshortcut.html – RajaRaviVarma

+1

QShortCut適用於基於QWidget的類。沒有直接的方法可以使本地QML元素響應全球捷徑。例如,可以將鍵分配給QML按鈕,但僅當按鈕具有焦點時才起作用。 –

+2

[在QML中使用QShortcut的應用程序範圍快捷方式](http://kdeblog.mageprojects/2012/2012/11/28/application-wide-shortcuts-using-qshortcut-in-qml/)在同一行中是有趣的。我正在使用QDeclarativeView(基於QWidget)作爲主內嵌QML的GUI屏幕,因此現在很容易實現應用程序範圍內的快捷方式。 –

回答

8

回答我的問題作爲快捷鍵現在可以使用Qt 5.1.1來實現。 快捷方式可以很容易地結合到QtQuick控制像ButtonToolButtonsMenuItem使用QML Action項。例如:

ApplicationWindow { 
    ... 
    ToolButton { action: openAction } // Add a tool button in a ToolBar 
    ... 
    Action { 
     id: openAction 
     text: "&Open" 
     shortcut: "Ctrl+O" 
     onTriggered: // Do some action 
     tooltip: "Open an image" 
    } 
} 

按下Ctrl + O將執行onTriggered部分中指定的操作。

在C++(QT)使用EventFilter參考Qt Quick Controls Gallery example

0

所以假設你正在呼籲像這樣的按鈕點擊事件的函數,

Button { 
    ... 
    MouseArea { 
    anchor.fill: parent 
    onClicked: callThisFunction(); 
    } 
} 

然後您可以分配以這種方式分配全局鍵盤快捷鍵。但是限制是全局QML元素(包含所有其他QML元素的父元素)應該有重點。防爆。 :

Rectangle { 
    id: parentWindow 
    ... 
    ... 
    Button { 
    ... 
    MouseArea { 
     anchor.fill: parent 
     onClicked: callThisFunction(); 
    } 
    } 
    Keys.onSelectPressed: callThisFunction() 
} 

這不完全是你想要的,但它可能有所幫助。

+0

請注意簡單介紹反對的原因。 – RajaRaviVarma

4

你完全可以使用快捷鍵在QML。

您可以在下面的步驟做的:

1. Create a Shortcut class by C++. 
2. Register QML Type for Shortcut class 
3. Import Shortcut to QML file and handle it. 

#ifndef SHORTCUT_H 
 
#define SHORTCUT_H 
 

 
#include <QDeclarativeItem> 
 

 
class Shortcut : public QObject 
 
{ 
 
    Q_OBJECT 
 
    Q_PROPERTY(QVariant key READ key WRITE setKey NOTIFY keyChanged) 
 
public: 
 
    explicit Shortcut(QObject *parent = 0); 
 

 
    void setKey(QVariant key); 
 
    QVariant key() { return m_keySequence; } 
 

 
    bool eventFilter(QObject *obj, QEvent *e); 
 

 
signals: 
 
    void keyChanged(); 
 
    void activated(); 
 
    void pressedAndHold(); 
 

 
public slots: 
 

 
private: 
 
    QKeySequence m_keySequence; 
 
    bool m_keypressAlreadySend; 
 
}; 
 

 
#endif // SHORTCUT_H

#include "shortcut.h" 
 
#include <QKeyEvent> 
 
#include <QCoreApplication> 
 
#include <QDebug> 
 
#include <QLineEdit> 
 
#include <QGraphicsScene> 
 

 
Shortcut::Shortcut(QObject *parent) 
 
    : QObject(parent) 
 
    , m_keySequence() 
 
    , m_keypressAlreadySend(false) 
 
{ 
 
    qApp->installEventFilter(this); 
 
} 
 

 
void Shortcut::setKey(QVariant key) 
 
{ 
 
    QKeySequence newKey = key.value<QKeySequence>(); 
 
    if(m_keySequence != newKey) { 
 
     m_keySequence = key.value<QKeySequence>(); 
 
     emit keyChanged(); 
 
    } 
 
} 
 

 
bool Shortcut::eventFilter(QObject *obj, QEvent *e) 
 
{ 
 
    if(e->type() == QEvent::KeyPress && !m_keySequence.isEmpty()) { 
 
//If you want some Key event was not filtered, add conditions to here 
 
     if ((dynamic_cast<QGraphicsScene*>(obj)) || (obj->objectName() == "blockShortcut") || (dynamic_cast<QLineEdit*>(obj))){ 
 
      return QObject::eventFilter(obj, e); 
 
     } 
 
     QKeyEvent *keyEvent = static_cast<QKeyEvent*>(e); 
 

 
     // Just mod keys is not enough for a shortcut, block them just by returning. 
 
     if (keyEvent->key() >= Qt::Key_Shift && keyEvent->key() <= Qt::Key_Alt) { 
 
      return QObject::eventFilter(obj, e); 
 
     } 
 

 
     int keyInt = keyEvent->modifiers() + keyEvent->key(); 
 

 
     if(!m_keypressAlreadySend && QKeySequence(keyInt) == m_keySequence) { 
 
      m_keypressAlreadySend = true; 
 
      emit activated(); 
 
     } 
 
    } 
 
    else if(e->type() == QEvent::KeyRelease) { 
 
     m_keypressAlreadySend = false; 
 
    } 
 
    return QObject::eventFilter(obj, e); 
 
}

qmlRegisterType<Shortcut>("Project", 0, 1, "Shortcut");

import Project 0.1 
 

 
Rectangle { 
 
................. 
 
................. 
 
Shortcut { 
 
     key: "Ctrl+C" 
 
     onActivated: { 
 
      container.clicked() 
 
      console.log("JS: " + key + " pressed.") 
 
     } 
 
    } 
 

 
}

+0

Thx,它確實有效 – Zeks

0

從Qt的5.9所需的行爲開始甚至included

import QtQuick 2.9 

Item { 
    Shortcut { 
     context: Qt.ApplicationShortcut 
     sequences: [StandardKey.Close, "Ctrl+W"] 

     onActivated: { 
      container.clicked() 
      console.log("JS: Shortcut activated.") 
     } 
    } 
} 

如果省略的背景下,它只會爲當前活動窗口的工作,否則對於整個應用程序,請參見documentation