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?
cevap
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.
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.
Aslında bir sinyal var - ['QApplication :: focusChanged'] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged). – sashoalm
[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. ' –
.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:
- 1. Android class AudioManager'da ses odağı nedir?
- 2. Java sinyal dağıtıcısı iş parçacığı nedir?
- 3. Odağı kullanarak bir uygulamanın belirli bir penceresine odağı ayarla
- 4. Xilinx FPGA'nın MGT'sine bir sinyal iletmenin en basit yolu nedir?
- 5. ContentEditable div odağı içeriyorsa,
- 6. Sinyal işleme için Python paketi
- 7. pyqt: Sıkma kutusu için preslenmiş sinyal geri dönüşü mü?
- 8. Odağı, MVVM
- 9. ScrollViewer odağı çalıyor
- 10. Bir düğme odağı nasıl alabilir?
- 11. Odağı bir düğmenin üzerine getirme
- 12. Neden SignalProducer bir Sinyal vermiyor?
- 13. Sinyal çıkışı arduino
- 14. wpf listview, odağı kaybetti
- 15. Sinyal kenarını tespit etmek için desen uydurma?
- 16. "Sinyal 15 alındı"
- 17. PyQt5 QMediaPlayer'a bir sinyal gönderiliyor
- 18. Bir zaman (veya zaman aralığı) doldurmanın en etkili yolu nedir?
- 19. Odağı temizle EditText, softkeyboard
- 20. ajaxSetup'ı kullanma Temel Auth için Gönderme Sonucu için sinyal kesiliyor Sinyal bağlantısı
- 21. bellek sızıntısı - sinyal 9
- 22. Odağı kaybetmek için edittext öğesine dokunun
- 23. Linux'ta sinyal ve rt_signal syscalls arasındaki fark nedir?
- 24. Veri sinyal gücünü belirleyin
- 25. Sinyal işlemek için Auto ve Lambda kullanma?
- 26. Sinyal SIGFPE soru
- 27. Qt kullanarak boost :: shared_ptr bir sinyal/yuvada
- 28. Bir pop-up için klavye odağı nasıl verilir Gtk.Window
- 29. Knockout.js giriş odağı tıklama
- 30. MessageBox odağı almıyor
Bir QLineEdit'in odağı kaybetmesiyle ilgileniyorsanız, 'QLineEdit :: editingFinished()' işareti o olayı yakalar. – waldyrious