2013-07-23 11 views
22

एक संवाद में, जब टैब कुंजी दबाया जाता है, तो फ़ोकस किसी अन्य विजेट में बदल जाता है। क्यूटी में, क्या कोई संकेत है जब विजेट अपना ध्यान खो देता है? क्या मैं इसका उपयोग यह जांचने के लिए कर सकता हूं कि इनपुट मान्य है या नहीं? यदि नहीं, तो क्या मैं फोकस वापस सेट कर सकता हूं और उपयोगकर्ता को फिर से इनपुट करने के लिए कह सकता हूं?जब कोई विजेट फोकस खो देता है तो सिग्नल क्या होता है?

+0

यदि आप 'QLineEdit' फोकस खोने में रूचि रखते हैं, तो' QLineEdit :: editFinished() 'सिग्नल उस ईवेंट को कैप्चर करता है। – waldyrious

उत्तर

18

कोई संकेत नहीं है लेकिन यदि आप जानना चाहते हैं कि आपके विजेट ने फोकस खो दिया है, तो अपने विजेट में void QWidget::focusOutEvent(QFocusEvent* event) को ओवरराइड और पुन: कार्यान्वित करें। जब भी आपका विजेट फोकस खो देता है तब इसे कॉल किया जाएगा। विजेट पर ध्यान देने के लिए, QWidget::setFocus(Qt::FocusReason) का उपयोग करें।

एक QLineEdit में इनपुट प्रमाणित करने के लिए या QComboBox आप QValidator उपवर्ग और अपने खुद के सत्यापनकर्ता को लागू, या मौजूदा उपवर्गों में से एक, QIntValidator, QDoubleValidator, या QRegExpValidator उपयोग कर सकते हैं। QLineEdit::setValidator(const QValidator*) और QComboBox::setValidator(const QValidator*) के साथ क्रमशः सत्यापनकर्ता सेट करें।

int MyDialog::exec() { 
    while (true) { 
    if (QDialog::exec() == QDialog::Rejected) { 
     return QDialog::Rejected; 
    } 
    if (validate()) { 
     return QDialog::Accepted; 
    } 
    } 
} 

bool MyDialog::validate() { 
    if (lineEdit->text().isEmpty()) { 
    QMessageBox::critical(this, "Invalid value", "The specified value is not valid"); 
    lineEdit->setFocus(); 
    lineEdit->selectAll(); 
    return false; 
    } 
    return true; 
} 

यह उपयोगकर्ता ठीक से संवाद को बंद करने की अनुमति नहीं देंगे:

आप एक मॉडल संवाद बॉक्स की सामग्री को मान्य करना चाहते हैं, एक तरह से इस तरह एक कार्यान्वयन के साथ QDialog::exec() ओवरराइड करने के लिए किया जाएगा बटन या स्वीकार किए गए भूमिका के साथ कोई अन्य बटन जब तक कि संवाद की सामग्री सफलतापूर्वक सत्यापित न हो जाए। इस उदाहरण में मुझे लगता है कि संवाद में QLineEdit नाम lineEdit है और validate फ़ंक्शन यह सुनिश्चित करेगा कि इसकी सामग्री खाली नहीं है। यदि ऐसा है, तो यह QLineEdit पर फ़ोकस सेट करेगा और फिर संवाद दिखाएगा।

+10

वास्तव में एक संकेत है - ['QAplication :: focusChanged'] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged)। – sashoalm

+0

[sashoalm] (https://stackoverflow.com/users/492336/sashoalm) की pithy टिप्पणी स्वीकार किए गए उत्तर होना चाहिए। बेशक, यह इस तरह काम नहीं करता है। [इस तरह के उत्तर] (https://stackoverflow.com/a/321677/2809027) पर [इस डुप्लिकेट प्रश्न] पर विचार करें (https://stackoverflow.com/questions/321656/get-a-notification-event- सिग्नल -वें-ए-क्यूटी-विजेट-होट-फ़ोकस) इसके बजाए। '' –

6

यह भी संभव है (और आसान) है संकेत खुद

सीपीपी में बनाने के लिए (मत भूलना MOC शामिल करने के लिए)

class FocusWatcher : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit FocusWatcher(QObject* parent = nullptr) : QObject(parent) 
    { 
     if (parent) 
     parent->installEventFilter(this); 
    } 
    virtual bool eventFilter(QObject *obj, QEvent *event) override 
    { 
     Q_UNUSED(obj) 
     if (event->type() == QEvent::FocusIn) 
     emit focusChanged(true); 
     else if (event->type() == QEvent::FocusOut) 
     emit focusChanged(false); 

     return false; 
    } 

Q_SIGNALS: 
    void focusChanged(bool in); 
}; 

और यह कनेक्ट करने के लिए:

connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething); 
संबंधित मुद्दे