2012-08-30 46 views
8

Tôi đang xây dựng một ứng dụng Desktop với QML và Qt Creator và hiện tôi đang nghiên cứu xử lý bàn phím và cách hoạt động với các phần tử QML. Tôi đã biết về việc thiếu các thay thế QML thích hợp cho các Widget Máy tính để bàn.Gán phím tắt cho các thành phần QML

Vấn đề hiện tại của tôi là tôi muốn gán một số lối tắt bàn phím chung cho một số thành phần QML cụ thể (như gán phím tắt cho các nút trên GUI) để kích hoạt chúng. Điều tốt nhất tôi có thể quản lý là sử dụng FocusScopes và Key Navigation để có thể điều hướng GUI thông qua bàn phím, nhưng điều này không giống nhau.

Có ai có thể đề xuất việc cần làm trong trường hợp này không? Có bất kỳ tính năng nào như vậy với Qt 5 không? Tôi không thể tìm thấy bất kỳ thông tin nào về điều này trên Internet.

+0

Hãy thử QShortcut này http://doc.qt.nokia.com/4.7-snapshot/qshortcut.html – RajaRaviVarma

+1

QShortCut hoạt động với các lớp dựa trên QWidget. Không có cách nào trực tiếp để làm cho các phần tử QML nguyên gốc đáp ứng với các vết cắt ngắn toàn cầu. Người ta có thể gán một chìa khóa cho một nút QML, ví dụ, nhưng nó chỉ hoạt động khi nút có tiêu điểm. –

+2

[Phím tắt ứng dụng rộng bằng cách sử dụng QShortcut trong QML] (http://kdeblog.mageprojects.com/2012/11/28/application-wide-shortcuts-using-qshortcut-in-qml/) là một điều thú vị trên cùng một dòng. Tôi đang sử dụng một QDeclarativeView (QWidget based) cho màn hình GUI chính với QML được nhúng bên trong để một lối tắt ứng dụng rộng bây giờ là dễ dàng. –

Trả lời

8

Trả lời câu hỏi của riêng tôi vì các phím tắt hiện có thể thực hiện trong Qt 5.1.1. Các phím tắt có thể dễ dàng được liên kết với các điều khiển QtQuick như Button, ToolButtonsMenuItem bằng cách sử dụng mục QML Action. ví dụ. :

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" 
    } 
} 

Nhấn Ctrl + O sẽ thực hiện tác vụ được chỉ định trong phần Bật được kích hoạt.

Tham khảo Qt Quick Controls Gallery example

0

Vì vậy, giả sử bạn đang kêu gọi một chức năng trên mà sự kiện nhấn nút như thế này,

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

Sau đó, bạn có thể gán gán phím tắt toàn cầu theo cách này. Nhưng giới hạn là phần tử QML toàn cầu (một phần tử cha mẹ chứa tất cả các phần tử QML khác) nên có trọng tâm. Ví dụ :

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

Đây không phải chính xác những gì bạn muốn nhưng nó có thể hữu ích.

+0

Hãy quan tâm để tóm tắt lý do bỏ phiếu xuống. – RajaRaviVarma

4

Bạn hoàn toàn có thể sử dụng phím tắt trong QML bằng cách sử dụng EventFilter trong C++ (QT).

Bạn có thể làm bằng các bước dưới đây:

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, nó thực sự hoạt động – Zeks

0

Bắt đầu từ Qt 5.9 hành vi mong muốn thậm chí còn included:

import QtQuick 2.9 

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

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

Nếu bạn bỏ qua bối cảnh, nó sẽ chỉ làm việc cho các cửa sổ đang hoạt động, nếu không cho toàn bộ ứng dụng, xem documentation.

Các vấn đề liên quan