2012-08-30 11 views
8

मैं क्यूएमएल और क्यूटी निर्माता के साथ डेस्कटॉप एप्लिकेशन बनाने में गहरा हूं और मैं वर्तमान में कीबोर्ड हैंडलिंग का शोध कर रहा हूं और यह क्यूएमएल तत्वों के साथ कैसे काम करता है। मैं पहले से ही डेस्कटॉप विजेट्स के लिए उचित QML प्रतिस्थापन की कमी के बारे में जानता हूं।क्यूएमएल घटकों को कीबोर्ड शॉर्टकट्स असाइन करना

मेरी वर्तमान समस्या यह है कि मैं कुछ विशेष क्यूएमएल घटकों (जैसे जीयूआई पर बटन के लिए कीबोर्ड शॉर्टकट असाइन करना) को कुछ ग्लोबल कीबोर्ड शॉर्टकट असाइन करना चाहता हूं, जिन्हें उन्हें सक्रिय करना चाहिए। सबसे अच्छा मैं प्रबंधित कर सकता हूं फोकसस्कोप और कुंजी नेविगेशन का उपयोग करना कीबोर्ड के माध्यम से जीयूआई को नेविगेट करने में सक्षम होने के लिए है, लेकिन यह वही बात नहीं है।

क्या कोई सुझाव दे सकता है कि इस परिदृश्य में क्या करना है? क्या क्यूटी 5 के साथ ऐसी कोई सुविधा आ रही है? मुझे इस पर इंटरनेट पर कोई जानकारी नहीं मिली।

+0

इस QShortcut को आजमाएं http://doc.qt.nokia.com/4.7-snapshot/qshortcut.html – RajaRaviVarma

+1

QShortCut QWidget आधारित कक्षाओं के साथ काम करता है। देशी क्यूएमएल तत्वों को वैश्विक शॉर्ट कटौती का जवाब देने का कोई सीधा तरीका नहीं है। कोई क्यूएमएल बटन की कुंजी आवंटित कर सकता है, उदाहरण के लिए, लेकिन यह केवल तभी काम करता है जब बटन फोकस करता है। –

+2

[QML में QShortcut का उपयोग कर एप्लिकेशन वाइड शॉर्टकट्स] (http://kdeblog.mageprojects.com/2012/11/28/application-wide-shortcuts-using-qshortcut-in-qml/) एक ही पंक्ति पर कुछ दिलचस्प है। मैं मुख्य GUI स्क्रीन के लिए एक QDeclarativeView (QWidget आधारित) का उपयोग कर रहा हूं जिसमें क्यूएमएल एम्बेडेड है, इसलिए एक एप्लीकेशन चौड़ा शॉर्टकट अब आसान है। –

उत्तर

8

अपने स्वयं के प्रश्न का उत्तर दें क्योंकि शॉर्टकट्स अब क्यूटी 5.1.1 में लागू करना संभव है। शॉर्टकट को Button, ToolButtons और MenuItem जैसे क्यूएमएल 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 दबाकर ऑन ट्रिगर अनुभाग में निर्दिष्ट क्रिया निष्पादित करेगा।

सी ++ (क्यूटी) में EventFilter का उपयोग करके Qt Quick Controls Gallery example

0

तो यह सोचते हैं आप इस तरह है कि बटन क्लिक करें घटना पर एक समारोह बुला रहे हैं,

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

तो फिर तुम इस तरह से वैश्विक कीबोर्ड शॉर्टकट असाइन असाइन कर सकते हैं। लेकिन सीमा वैश्विक क्यूएमएल तत्व (एक मूल तत्व जो अन्य सभी क्यूएमएल तत्व रखता है) पर ध्यान केंद्रित होना चाहिए। पूर्व। :

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

क्यूटी 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 देखें।

संबंधित मुद्दे