Domanda

Non so davvero come formulare la mia domanda questa volta ...

Ho la mia applicazione con un QDialog come finestra principale. L'applicazione riceve diversi valori come temperatura, umidità e così via da una macchina remota.

Per lo sviluppo ho aggiunto una casella di gruppo con diversi widget per simulare questi valori. Ho diversi limiti per lanciare avvisi e allarmi all'utente.

Ad esempio, se la temperatura supera i 30 ° C, apro un QMessageBox con l'ora della richiesta (l'applicazione esegue il polling sulla macchina remota) e la temperatura corrente. Quindi questo viene aggiornato ad ogni ciclo di richiesta.

Uso il metodo show () per visualizzare la finestra di messaggio che mantiene la mia applicazione in esecuzione in background. Il problema ora è: il focus è sulla finestra del messaggio e non è possibile fare clic su nulla nella mia finestra principale / QDialog finché la finestra del messaggio non viene accettata / non è terminata.

E questo è il mio problema: in modalità simulazione voglio giocare con diversi valori di temperatura che posso regolare tramite il cursore nella finestra principale. Come posso accedere a questi widget / rendere la finestra di messaggio in qualche modo "non bloccante"?

Cordiali saluti,

Matthias

È stato utile?

Soluzione

Quello che stai vivendo è chiamato "modalità" di una finestra.Per impostazione predefinita, un QMessageBox è "application modal".Ciò significa che l'input a tutte le altre finestre dell'applicazione è bloccato.

Per modificare la modalità, utilizza setWindowModality () con un valoreda Qt :: WindowModality appena prima di chiamare show().Nel tuo caso:

box->setWindowModality(Qt::NonModal);
box->show();

Altri suggerimenti

In effetti hai una finestra di messaggio modale che è il modo in cui QMessageBox dovrebbe funzionare - cioè l'utente deve essere avvisato e l'interfaccia utente è protetta da ulteriori interazioni finché l'utente non ha registrato il messaggio, chiuso la finestra di messaggio e (se necessario) ha intrapreso qualsiasi azione richiesta in risposta al messaggio.

Ora se imposti la modalità della finestra di messaggio su Qt :: NonModal, (ricorda di assegnarla a una variabile che non uscirà dall'ambito quando l'applicazione continua dopo aver visualizzato la casella di messaggio) sarai in grado di interagire con l'interfaccia utente anche mentre è visualizzata la finestra di messaggio., che devo dire è "insolito". Se capisco la tua esigenza, avrai già la finestra di messaggio aperta - quindi mentre è ancora attiva, ti consigliamo di giocare con diversi valori di temperatura nella finestra principale - con che effetto? Fino a quando non viene prodotta un'altra finestra di dialogo del messaggio? La finestra di messaggio dovrà essere eliminata a un certo punto.

Non solo, ma se mostri una finestra di messaggio non modale e poi interagisci con la finestra principale, è molto probabile che la finestra di messaggio scompaia dietro la finestra principale, fuori dalla vista comunque.

Suggerirei che le finestre di messaggio siano generalmente trattate come previsto: solo caselle di avviso modali transitorie e temporanee e che forse è necessario un report live / area di stato chiaramente visibile nella finestra principale piuttosto che utilizzare un QMessageBox non modale.

Spero che questo aiuti

Saluti

Roger

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top