2013-07-23 8 views
22

Bir iletişim kutusunda sekmesi tuşuna basıldığında, odak başka bir widget'a geçer. Qt'de, bir widget'ın odağını kaybettiği zaman için bir sinyal var mı? Girişin geçerli olup olmadığını kontrol etmek için kullanabilir miyim? Değilse, odağı tekrar ayarlayabilir ve kullanıcıdan tekrar giriş yapmasını isteyebilir miyim?Bir widget'ın odağı kaybettiği zaman için sinyal nedir?

+0

Bir QLineEdit'in odağı kaybetmesiyle ilgileniyorsanız, 'QLineEdit :: editingFinished()' işareti o olayı yakalar. – waldyrious

cevap

18

Sinyal yok, ancak widget öğenizin ne zaman kaybolduğunu bilmek istiyorsanız, widget'ınızda void QWidget::focusOutEvent(QFocusEvent* event)'u geçersiz kılın ve yeniden işleyin. Widget'ınız odağı kaybettiğinde çağrılır. Bir widget'a odaklanmak için QWidget::setFocus(Qt::FocusReason)'u kullanın.

bir QLineEdit yılında giriş doğrulamak için ya QComboBox sen QValidator alt sınıf ve kendi doğrulayıcı uygulamak veya mevcut alt sınıflarından birini QIntValidator, QDoubleValidator veya QRegExpValidator kullanabilirsiniz. Doğrulayıcıyı sırasıyla QLineEdit::setValidator(const QValidator*) ve QComboBox::setValidator(const QValidator*) ile ayarlayın. Kullanıcının OK ile iletişim kutusunu kapatmak için izin vermez

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; 
} 

: Eğer kalıcı bir iletişim kutusunun içeriğini doğrulamak isterseniz

, tek yönlü böyle bir uygulama ile QDialog::exec() geçersiz olacaktır iletişim kutusunun içeriği başarıyla doğrulanmadıkça, Düğme veya Kabul edilen rol ile başka bir düğme. Bu örnekte iletişim kutusunun, lineEdit adında bir QLineEdit ve validate işlevinin içeriğinin boş olmadığından emin olacağını varsayalım. Öyleyse, odağı QLineEdit'a ayarlayacak ve iletişim kutusunu tekrar gösterecektir.

+10

Aslında bir sinyal var - ['QApplication :: focusChanged'] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged). – sashoalm

+0

[sashoalm] (https://stackoverflow.com/users/492336/sashoalm) 'in özlü yorumu kabul edilen cevap olmalıdır. Tabii ki böyle çalışmıyor. [Bu benzer soru] 'u (https://stackoverflow.com/a/321677/2809027) [bu yinelenen soru]' da (https://stackoverflow.com/questions/321656/get-a-notification-event-signal -when-a-qt-widget-gets-focus) yerine. ' –

6

.cpp olarak sinyal kendinize

oluşturmak da mümkündür (ve daha kolay) 'dir

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); 
}; 

(moc eklemeyi unutmayın) Ve bağlamak için: