2013-04-06 3 views
10

को बंद करने से एंटर कुंजी को कैसे रोकूं I QDialogButtonBox के साथ है। ठीक और रद्द करें बटन सक्रिय हैं। कभी-कभी मैं अपने संवाद की स्थिति के आधार पर ओके बटन को अक्षम या छुपाता हूं। ऐसा लगता है, कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, एंटर कुंजी हमेशा ठीक बटन को सक्रिय करती है। मैं वास्तव में ऐसा नहीं करना चाहता हूं। मैंने कोशिश की है: हर बार जब मैं दिखाने/छिपाने// अक्षम सक्षम/किसी भी बटन मैं अपने QDialog (Qt 4.8.1)

  • ठीक बटन पर एक घटना फिल्टर स्थापित करने महत्वपूर्ण घटनाओं रोकना

    • सेटिंग डिफ़ॉल्ट और autoDefault गुण गलत पर (दबाया जाता है और जारी की) वापसी के लिए, दर्ज करें और अंतरिक्ष
    • करने के लिए बटन पर ध्यान केंद्रित नीति को सेट करने NoFocus

    और इसके बाद के संस्करण उन चीजों के सभी संयोजनों के साथ, Enter कुंजी अभी भी संवाद स्वीकार करता है। क्या किसी के पास कोई संकेत है कि इसे कैसे अवरुद्ध करें? ऐसा लगता है कि मुझे इस तरह के कुछ को अवरुद्ध करने में सक्षम होना चाहिए?

  • +0

    आप पोस्ट घटना फिल्टर कोड पोस्ट कर सकते हैं? –

    +0

    क्या यह आपका स्वयं का संवाद है या आप मानक संवाद क्यूटी प्रदान करते हैं? – dtech

    +0

    मेरा संवाद वर्ग – cppguy

    उत्तर

    7

    कुंजी प्रेस ईवेंट फ़िल्टरिंग स्वयं संवाद पर की जानी चाहिए, क्योंकि डिफ़ॉल्ट बटन पर Return और Enter कुंजी की अग्रेषण को संभालने वाला कोड QDialog::keyPressEvent में है।

    void Dialog::keyPressEvent(QKeyEvent *evt) 
    { 
        if(evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return) 
         return; 
        QDialog::keyPressEvent(evt); 
    } 
    

    या

    theDialog−>installEventFilter(anotherClassObject); 
    
    bool AnotherClass::eventFilter(QObject *obj, QEvent *evt) 
    { 
        if(evt->type() == QEvent::KeyPress) { 
         QKeyEvent *keyEvent = static_cast<QKeyEvent*>(evt); 
         if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) 
          return true; // mark the event as handled 
        } 
        return false; 
    } 
    
    +0

    पर सही ढंग से स्थित बटनों का लाभ नहीं मिलता है, क्या मुझे ईवेंट को अनदेखा करना चाहिए? – cppguy

    +0

    यह काम नहीं किया। एंटर दबाए जाने पर मुझे अपने QDialog आधारित क्लास में एक keyPressEvent कॉल नहीं मिलता है। – cppguy

    +2

    आपको ईवेंट को अनदेखा नहीं करना चाहिए, लेकिन इसे स्वीकार करें और कुछ भी नहीं करें। लेकिन अगर रद्द बटन अभी भी सक्षम है, और फोकस प्राप्त कर सकता है, तो यह अभी भी एंटर कुंजी द्वारा सक्रिय हो सकता है और संवाद बंद कर सकता है। – alexisdm

    1

    QDialog एक निजी स्लॉट accept() कहा जाता है। जब भी QDialogButtonBox accepted() (वापसी कुंजी दबाकर या ठीक क्लिक करके) उत्सर्जित करता है, तो उस निजी स्लॉट को कॉल किया जाता है। तो उन्हें डिस्कनेक्ट करने का प्रयास करें।

    disconnect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));

    यह मेरे लिए काम किया।

    +0

    का उपयोग करके काम करता है मैंने कभी भी उस कनेक्शन को स्पष्ट रूप से सेट नहीं किया और बहुत पहले ui फ़ाइल से उस कनेक्शन को हटा दिया – cppguy

    -1

    PySide में (और मैं PyQt कल्पना) मैं QDialog के स्वीकार या अस्वीकार करती कार्यों को फिर से परिभाषित करने में सक्षम था।

    def custom_accept(): 
        # perform custom actions when you hit open 
        pass 
    
    def custom_reject(): 
        # perform custom actions when you hit cancel 
        pass 
    
    file_dialog = QtGui.QFileDialog(directory=".") 
    file_dialog.accept = custom_accept 
    file_dialog.reject = custom_reject 
    

    इस समापन से फ़ाइल संवाद रखा और मुझे डेटा तक पहुँच दे दी है जब 'ठीक है' (स्वीकार) या 'रद्द करें' (अस्वीकार) कार्य शुरू हो गया है (या तो प्रवेश के साथ या बटन पर क्लिक करके)

    1

    समस्या यह है कि इवेंट फ़िल्टर ठीक बटन पर स्थापित नहीं होना चाहिए।

    अपने ठीक बटन अक्षम किया गया है, तो यह प्रवेश घटना प्राप्त करने के लिए नहीं जा रहा है। जो भी विजेट फोकस होगा। और यदि वे एंटर ईवेंट स्वीकार नहीं करते हैं, तो QDialogaccept() पर जा रहा है।

    दो तरीके समस्या को हल करने के लिए:

    1) अवहेलना QDialog::accept() और कॉल QDialog नया accept समारोह में विधि स्वीकार ही अगर ठीक सक्षम किया गया है

    void MyDialog::accept() { 
        if (okEnabled) { 
         QDialog::accept(); 
        } 
    } 
    

    2)पर में प्रत्येक विजेट पर एक ईवेंट फ़िल्टर इंस्टॉल करें जो एंटर कुंजी स्वीकार नहीं करता है (लाइन संपादन , ...)।

    घटना फिल्टर इसलिए जैसा होगा:

    class KeyPressEater : public QObject 
    { 
        Q_OBJECT 
    
    protected: 
        bool eventFilter(QObject *obj, QEvent *event); 
    }; 
    
    bool KeyPressEater::eventFilter(QObject *obj, QEvent *event) 
    { 
        if (event->type() == QEvent::KeyPress) { 
         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
         bool res = QObject::eventFilter(obj, event); 
    
         if (keyEvent->key() == Qt::Key_Return) { 
          return true; /* Always accept return */ 
         } else { 
          return res; 
         } 
        } else { 
         // standard event processing 
         return QObject::eventFilter(obj, event); 
        } 
    } 
    

    और अपने कोड में, संवाद में प्रत्येक विजेट के लिए:

    myWidget->installEventFilter(myKeyPressEater); 
    
    1

    आप फिर संवाद पर सामान्य QPushButtons है, तो बटन अगर उनके पास autoDefault और/या डिफ़ॉल्ट गुण सेट हैं, तो आपको एक डिफ़ॉल्ट बटन मिलता है - जो कि कुंजी कुंजी ट्रिगर्स होता है। उस स्थिति में, बटन पर ऑटोडिफॉल्ट से छुटकारा पाएं और किसी अन्य विजेट में एंटर दबाकर अब संवाद बंद नहीं हो जाता है।

    QDialogButtonBox के मामले में आप शायद इस संवाद को अपने संवाद के सीटीआर में बंद करने के लिए बटनों पर फिर से चल सकते हैं। यहां परीक्षण नहीं किया गया है लेकिन काम करना चाहिए। यदि नहीं तो आपको यह भी देखना होगा कि एक डिफ़ॉल्ट बटन है जो QDialog पर भी सेट हो जाता है।

    0

    बंद करने से "ठीक" बटन या "एंटर" कुंजी से बचने के लिए: ui xml फ़ाइल में, स्वीकार/अस्वीकार करने के लिए कनेक्ट/स्लॉट हटा दें। फिर, अपने कोड में, स्वीकार करें() कब और आवश्यकतानुसार;

    ui फ़ाइल जो स्वीकार करते हैं() स्लॉट जोड़ता है से उदाहरण:

    <connections> 
        <connection> 
    
        <sender>products_ButtonBox</sender> 
    
        <signal>accepted()</signal> 
    
        <receiver>Products_Dialog</receiver> 
         <slot>accept()</slot> 
         <hints> 
         <hint type="sourcelabel"> 
         <x>248</x> 
         <y>254</y> 
         </hint> 
         <hint type="destinationlabel"> 
         <x>157</x> 
         <y>274</y> 
         </hint>e 
         </hints> 
         </connection>