2010-01-12 18 views
7

ग्रीटिंग्स,"पूर्ववत करें", "कट", "पेस्ट" और "कॉपी" के साथ "संपादन" मेनू को कैसे कार्यान्वित करें?

मेरे अनुप्रयोगों में से एक के लिए मैं एक "संपादन" मेनू को लागू करने की कोशिश कर रहा हूं। इस मेनू में आमतौर पर मानक प्रविष्टियां पूर्ववत, कट, और पेस्ट पेस्ट करें।

यह मेनू डिफ़ॉल्ट रूप से वहाँ नहीं है, और उपयोगकर्ताओं को विशेष रूप से मैक ओएस एक्स

पर यह उम्मीद करने लगते हैं इस को लागू करने, हर विजेट मैन्युअल रूप में ऐसा करने के बिना की एक एक आसान तरीका है? चूंकि अधिकांश विगेट्स में प्रतिलिपि/पेस्ट/पूर्ववत तंत्र पहले से ही शॉर्टकट के माध्यम से लागू होता है, इसलिए मैं उन्हें कुछ सरल मेनू क्रियाएं भी प्रदान करना चाहता हूं जो उन्हें भी कॉल करते हैं।

क्रियाओं को जो भी विजेट पहले ध्यान केंद्रित करना चाहिए, उसे कॉल करना चाहिए, फिर उन्हें घटनाओं को ऊपर की ओर ले जाना चाहिए, मुझे लगता है।

मैं क्यूटी 4.6 का उपयोग कर रहा विंडोज, लिनक्स और मैक ओएस एक्स पर

धन्यवाद!

उत्तर

6

आवश्यक कार्यक्षमता का आधा पूरा करने में काफी आसान है। अपनी मुख्य विंडो कक्षा में आवश्यक क्यूक्शन (कॉपी/पेस्ट/अंडो/आदि) के साथ बस संपादन मेनू बनाएं और उन्हें स्लॉट से कनेक्ट करें। स्लॉट में, सही कुंजी प्रेस का अनुकरण करें और ईवेंट जारी करें (उदा। प्रतिलिपि के लिए Ctrl + C) और उन्हें वर्तमान में केंद्रित विजेट पर भेजें। कोड में, इस तरह कुछ:

MainWindow::MainWindow(...) 
{ 
    ... 
    connect(actionCopy, SIGNAL(triggered()), SLOT(copy())); 
    ... 
} 
... 
void MainWindow::copy() 
{ 
    QWidget* focused = QApplication::focusWidget(); 
    if(focused != 0) 
    { 
     QApplication::postEvent(focused, 
           new QKeyEvent(QEvent::KeyPress, 
               Qt::Key_C, 
               Qt::ControlModifier)); 
     QApplication::postEvent(focused, 
           new QKeyEvent(QEvent::KeyRelease, 
               Qt::Key_C, 
               Qt::ControlModifier)); 
} 

बेशक, यह काफी हैक है। आपको प्रत्येक लक्ष्य प्लेटफॉर्म के लिए कोड को संशोधित करने की आवश्यकता है, जो कि कीबोर्ड के शॉर्टकट को सही लोगों में बदल रहा है, और ऐसा हो सकता है कि फोकस प्राप्त करने वाला विजेट Ctrl + C के साथ कुछ अनपेक्षित हो। मेरी राय में, इस विधि में सबसे खराब नकारात्मकता यह है कि आप संपादन मेनू आइटम की सक्षम स्थिति को सही ढंग से नियंत्रित नहीं कर सकते हैं। एक सामान्य विजेट से पूछना संभव नहीं है कि एक प्रतिलिपि या पेस्ट ऑपरेशन संभव होगा या नहीं।

मैं इस समस्या का वास्तविक समाधान खोजने में असमर्थ हूं - और यह पता लगाने में हैरान होगा कि एक मौजूद है - क्योंकि प्रतिलिपि/पेस्ट कार्यक्षमता आमतौर पर कक्षा के कोड के अंदर छिपी जाती है और सिग्नल के किसी मानक सेट के माध्यम से प्रकट नहीं होती है/स्लॉट्स। कार्यक्षमता के साथ आज रात के प्रयोगों के बाद, मैंने अपने आवेदन से एक संपादन मेनू भूलने का फैसला किया है और उपयोगकर्ताओं को कीबोर्ड शॉर्टकट जानने की उम्मीद है, या संदर्भ संवेदनशील मेनू का उपयोग करें।

+1

भयानक खबर। हालांकि धन्यवाद – aehlke

0

मेरी धारणा यह है कि संपादन मेनू केंद्रीय दस्तावेज़ विजेट पर लागू होता है, न कि छोटे से लोड। मैंने परीक्षण नहीं किया है, लेकिन यदि आपके पास QLineEdits के साथ कोई फ़ॉर्म है, तो संपादन मेनू (मेनू बार में) वास्तव में उस विजेट पर लागू होता है। क्या आप संदर्भ मेनू को सरल नहीं बनाते हैं या इन विकल्पों तक पहुंचने के लिए शॉर्ट-कट दबाते हैं ...

+2

विंडोज़/लिनक्स के लिए खिड़की प्रबंधकों की तरह यह सच हो सकता है। ओएस एक्स पर, हालांकि, आपके पास स्क्रीन के शीर्ष पर एक एप्लिकेशन-विस्तृत मेनू बार है, न कि प्रत्येक विंडो के शीर्ष पर। और मैक उपयोगकर्ता उम्मीद करते हैं कि चयनित मेनू कार्रवाई शीर्षतम विंडो और वर्तमान में फोकस वाले विजेट पर प्रभाव डालेगी। (पेस्ट का चयन क्लिपबोर्ड में जो कुछ भी है, वह QLineEdit में पेस्ट करेगा जो वर्तमान में फोकस है, आदि) – BastiBen

0

उपयोगकर्ता 285740 के समाधान ने मेरी मदद नहीं की, क्योंकि मैं अपने ऐप (सीईएफ या वेबकिट, कोई फर्क नहीं पड़ता) में ब्राउज़र नियंत्रण का उपयोग कर रहा हूं।

क्यों? ब्राउज़रों के लिए, focusWidget() हमेशा NULL लगता है, क्योंकि <input> तत्व विजेट नहीं हैं। मैंने अन्य विजेट्स पर postEvent() की कोशिश की - काम नहीं किया। QAction::TextHeuristicRole के साथ मेनू आइटम जोड़ना + QKeySequence::Copy जैसे मानक अनुक्रमों ने नौकरी नहीं की, (मैं उन्हें केवल अपने स्लॉट पर कनेक्ट कर सकता हूं, न कि मानक स्लॉट के लिए)। Cefclient नमूना एक xib फ़ाइल लोड करता है, लेकिन यह मेरे लिए एक विकल्प नहीं है, क्योंकि क्यूटी स्क्रैच से सब कुछ बनाता है।

आखिरकार, मुझे समाधान मिला! ObjectiveC++ कोड से वही मेनू आइटम बनाएं। वे QMenuBar, लेकिन के माध्यम से बनाए गए की तरह काम करते वे की तरह @selector(copy:)

कुछ असली स्वत: कार्रवाई से जोड़ा जा सकता आप एक उदाहरण यहां पा सकते हैं (!): nsMenuUtilsX::GetStandardEditMenuItem(), बस करना है कि आपके ObjC++ कोड से।

लेकिन, यदि आप QApplication::exec() से पहले इसे निष्पादित करते हैं तो यह कोड काम नहीं करता है। क्यूटी फिर मुख्य मेनू प्रोग्रामेटिक रूप से "पुनः लिखता है" ... इसे कैसे ठीक करें? खैर, शायद मैं एक क्यूटीमर की तरह कुछ हैक जोड़ दूंगा। यह ऐसा नहीं करता है यदि आप QMenuBar के माध्यम से अन्य आइटम जोड़ने का प्रयास नहीं करते हैं। अब ठिक है! क्यूटी-स्वतंत्र मेनू।

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

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