2009-12-12 5 views
5

मैं अपने मुख्य विंडो के मेनू में QAction एस का एक गुच्छा जोड़ रहा हूं। इन क्रियाओं को कीबोर्ड द्वारा भी ट्रिगर किया जा सकता है, और मैं सामान्य रूप से मेनू में शॉर्टकट दिखाना चाहता हूं, उदा।क्यूटी में, मेनू में कीबोर्ड शॉर्टकट कैसे दिखाएं लेकिन उन्हें अक्षम करें?

----------------- 
|Copy  Ctrl+C| 
----------------- 

मैं QAction.setShortcut() का उपयोग करके ऐसा कर सकता हूं। हालांकि, मैं शॉर्टकट द्वारा ट्रिगर किए जाने के लिए इन QAction एस चाहते हैं; मैं अलग-अलग कीबोर्ड इनपुट को कहीं और अलग कर रहा हूं।

क्या यह संभव है? क्या मैं क्यूएक्शन में शॉर्टकट अक्षम कर सकता हूं लेकिन अभी भी शॉर्टकट टेक्स्ट है (इस उदाहरण में Ctrl + सी) मेरे मेनू में?

संपादित: जिस तरह से मैं कर रहा यह तो वे ही सक्रिय हैं जब मेनू दिखाया गया है शॉर्टकट अक्षम करने मेनू के aboutToShow() और aboutToHide() घटनाओं से जुड़ रहा है, और सक्षम/समाप्त हो गया। लेकिन मैं एक क्लीनर समाधान की सराहना करेंगे ...

+1

बस ब्याज की खातिर, क्यों तुम कहीं और सभी कुंजीपटल इनपुट संभाल रहे हैं:

यहाँ एक पूर्ण उदाहरण है? –

उत्तर

8

आप QAction से विरासत सकता है और ओवरराइड QAction :: घटना (QEvent *):

class TriggerlessShortcutAction : public QAction 
{ 
public: 
    ...ctors... 

protected: 
    virtual bool event(QEvent* e) 
    { 
     if (e->type() == QEvent::Shortcut) 
      return true; 
     else 
      return QAction::event(e); 
    } 
}; 

इस प्रकार QEvent के किसी भी घटनाओं का कारण होगा :: शॉर्टकट भेजा 'ट्रिगर()' संकेतों को ट्रिगर नहीं करने के लिए आपके कार्यों में।

+0

या, इससे भी बेहतर, subclassing के बजाय एक ईवेंट फ़िल्टर का उपयोग करें। – andref

+0

दुर्भाग्यवश न तो सबक्लास और न ही ईवेंट फ़िल्टर मेरे लिए काम कर रहे हैं; QAction को QShortcutEvent प्राप्त नहीं हो रहा है। यह कार्यक्रम के किसी अन्य भाग के साथ एक बातचीत हो सकती है, मैं पता लगाने की कोशिश करूंगा। इस बीच में मैं अपने मूल समाधान पर वापस आ गया हूं ... –

+0

मैंने इसे विंडोज़ पर परीक्षण किया और यह काम किया। शायद इसे एक नई परियोजना में करने का प्रयास करें, यह एक प्लेटफॉर्म मुद्दा हो सकता है ... –

4
action.setText("Copy\tCtrl+C"); 

यह शॉर्टकट के साथ एक क्रिया की तरह दिखेगा, लेकिन शॉर्टकट वास्तव में स्थापित नहीं है।

#include <QtGui> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    QMainWindow win; 

    QMenu *menu = win.menuBar()->addMenu("Test"); 

    // This action will show Ctrl+T but will not trigger when Ctrl+T is typed. 
    QAction *testAction = new QAction("Test\tCtrl+T", &win); 
    app.connect(testAction, SIGNAL(triggered(bool)), SLOT(quit())); 
    menu->addAction(testAction); 

    // This action will show Ctrl+K and will trigger when Ctrl+K is typed. 
    QAction *quitAction = new QAction("Quit", &win); 
    quitAction->setShortcut(Qt::ControlModifier + Qt::Key_K); 
    app.connect(quitAction, SIGNAL(triggered(bool)), SLOT(quit())); 
    menu->addAction(quitAction); 

    win.show(); 

    return app.exec(); 
} 
+0

यह वास्तव में शॉर्टकट स्थापित करता है (क्यूटी 4.6, मैक) –

+0

उपर्युक्त उदाहरण के साथ, क्या Ctrl + T मैक पर एप्लिकेशन को छोड़ देता है? विंडोज और लिनक्स पर क्यूटी 4.6 के साथ, Ctrl + T कार्रवाई को ट्रिगर नहीं करता है। – baysmith

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