In una finestra, quando si preme il tasto discheda, i cambiamenti di messa a fuoco a un altro widget. In Qt, c'è qualche segnale per quando un widget perde il suo focus? Posso usarlo per verificare se l'input è valido o no? In caso contrario, posso impostare lo stato attivo e chiedere all'utente di reinserire?Qual è il segnale per quando un widget perde lo stato attivo?
risposta
Non c'è segnale, ma se vuoi sapere quando il tuo widget ha perso lo stato attivo, ridefinisci e reimplementa void QWidget::focusOutEvent(QFocusEvent* event)
nel tuo widget. Sarà chiamato ogni volta che il tuo widget ha perso il focus. Per concentrarsi su un widget, utilizzare QWidget::setFocus(Qt::FocusReason)
.
per convalidare l'input in un QLineEdit
o QComboBox
si può sottoclasse QValidator
e implementare il proprio validatore, o utilizzare una delle sottoclassi esistenti, QIntValidator
, QDoubleValidator
o QRegExpValidator
. Impostare il validatore con rispettivamente QLineEdit::setValidator(const QValidator*)
e QComboBox::setValidator(const QValidator*)
.
Se si desidera convalidare il contenuto di una finestra di dialogo modale, in un modo sarebbe quello di ignorare QDialog::exec()
con un'implementazione del genere:
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;
}
Non permetterà all'utente di chiudere la finestra di dialogo con l'OK pulsante o qualsiasi altro pulsante con il ruolo accettato a meno che il contenuto della finestra di dialogo non venga convalidato correttamente. In questo esempio ho assumere la finestra di dialogo ha un nome QLineEdit
lineEdit
e la funzione validate
assicurerò che il suo contenuto non è vuoto. Se lo è, imposterà lo stato attivo su QLineEdit
e mostrerà di nuovo la finestra di dialogo.
C'è in realtà è un segnale - [ 'QApplication :: focusChanged'] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged). – sashoalm
[sashoalm] (https://stackoverflow.com/users/492336/sashoalm) 's commento concisa dovrebbe essere la risposta accettata. Certo, non funziona così. Considerare l'upvoting [questa risposta simile] (https://stackoverflow.com/a/321677/2809027) a [questa domanda duplicata] (https://stackoverflow.com/questions/321656/get-a-notification-event-signal -when-a-qt-widget-gets-focus). '' –
E 'anche possibile (e più facile) per creare il segnale da soli
Nel cpp (non dimenticate di includere la 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);
};
E per collegarlo:
connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething);
- 1. editText non perde lo stato attivo
- 2. selezione cambia colore quando Firefox perde lo stato attivo
- 3. WPF: Rileva quando la finestra perde lo stato attivo
- 4. Come modificare lo sfondo di un widget genitore quando è attivo un widget figlio?
- 5. Come ottenere un evento quando il controllo del testo perde lo stato attivo?
- 6. ListView in SlidingDrawer perde lo stato attivo dopo onResume
- 7. È possibile impedire a livello di programmazione una pausa quando la finestra perde lo stato attivo?
- 8. Qt: mantiene la finestra secondaria sopra il genitore anche quando perde lo stato attivo
- 9. Come impostare lo stato attivo del widget Tkinter?
- 10. Un Jtable può salvare i dati ogni volta che una cella perde lo stato attivo?
- 11. L'elemento selezionato perde stile quando lo stato attivo si sposta in WBox ListBox
- 12. Disabilita cambio colore quando l'elenco delle fonti perde lo stato attivo
- 13. TextBox - Posso mantenere l'evidenziazione della selezione quando perde lo stato attivo?
- 14. NSWindow non riceve alcuna notifica quando si perde lo stato attivo
- 15. Android: Rileva quando viene lanciata un'altra attività (oppure l'attività perde lo stato attivo)
- 16. Mostra il cursore all'interno di EditText quando lo stato attivo non è attivo EditText
- 17. Funzione jQuery quando una casella di testo perde lo stato attivo
- 18. Impostare lo stato attivo su un pulsante
- 19. pyqt: riceve il segnale quando il widget diventa visibile/nascosto
- 20. Modifica lo stato attivo da un widget di testo a un altro
- 21. CEdit seleziona tutto quando ottiene lo stato attivo
- 22. Come impostare lo stato attivo su un widget del pulsante a livello di programmazione?
- 23. Come impostare lo stato attivo su un'altra finestra?
- 24. Bootstrap 3 Scrollspy rimuove lo stato attivo
- 25. Firefox non aggiorna la pagina correttamente quando lo stato cambia quando non è attivo
- 26. Perché un'area non client sostituita mostra l'impostazione predefinita quando la finestra perde lo stato attivo su win32?
- 27. WPF: Impossibile impostare lo stato attivo
- 28. Come avviare jquery datepicker con lo stato attivo
- 29. Come rendere SearchView perdere lo stato attivo e comprimere quando si fa clic altrove sull'attività
- 30. FacebookSDKException: sessione non è attivo, non poteva memorizzare lo stato
Se siete interessati a un 'QLineEdit' perdere la concentrazione, la' 'segnale QLineEdit :: editingFinished() cattura quell'evento. – waldyrious