Frage

Ich weiß diesmal nicht wirklich, wie ich meine Frage formulieren soll ...

Ich habe meine Anwendung mit einem QDialog als Hauptfenster. Die Anwendung erhält unterschiedliche Werte wie Temperatur, Luftfeuchtigkeit usw. von einem Remote-Computer.

Für die Entwicklung habe ich ein Gruppenfeld mit verschiedenen Widgets hinzugefügt, um diese Werte zu simulieren. Ich habe unterschiedliche Grenzwerte für das Auslösen von Warnungen und Alarmen an den Benutzer.

Wenn zum Beispiel die Temperatur über 30 ° C steigt, öffne ich eine QMessageBox mit der Anforderungszeit (die Anwendung ruft auf dem Remote-Computer ab) und der aktuellen Temperatur. Dies wird also bei jedem Anforderungszyklus aktualisiert.

Ich verwende die show () -Methode, um das Meldungsfeld aufzurufen, in dem meine Anwendung im Hintergrund ausgeführt wird. Das Problem ist jetzt: Der Fokus liegt auf dem Meldungsfeld und nichts in meinem Hauptfenster / QDialog kann angeklickt werden, bis das Meldungsfeld nicht akzeptiert wird / beendet wurde.

Und das ist mein Problem: Im Simulationsmodus möchte ich mit verschiedenen Temperaturwerten herumspielen, die ich mit dem Schieberegler im Hauptfenster einstellen kann. Wie kann ich auf diese Widgets zugreifen / das Meldungsfeld irgendwie "nicht blockieren"?

Mit freundlichen Grüßen

Matthias

War es hilfreich?

Lösung

Was Sie erleben, wird als "Modalität" eines Fensters bezeichnet.Standardmäßig ist ein QMessageBox "application modal".Dies bedeutet, dass die Eingabe in alle anderen Anwendungsfenster blockiert ist.

Um die Modalität zu ändern, verwenden Sie setWindowModality () mit einem Wertvon Qt :: WindowModality kurz bevor Sie show() aufrufen.In Ihrem Fall:

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

Andere Tipps

In der Tat haben Sie ein modales Meldungsfeld, wie QMessageBox funktionieren soll - dh der Benutzer soll benachrichtigt werden und die Benutzeroberfläche ist vor weiteren Interaktionen geschützt, bis der Benutzer die Nachricht registriert, das Meldungsfeld geschlossen und (falls) erforderlich) hat alle erforderlichen Maßnahmen ergriffen, um auf die Nachricht zu antworten.

Wenn Sie nun die Nachrichtenfeldmodalität auf Qt :: NonModal setzen (denken Sie daran, sie einer Variablen zuzuweisen, die nicht den Gültigkeitsbereich verlässt, wenn Ihre Anwendung nach dem Aufrufen der Nachrichtenbox fortgesetzt wird), können Sie interagieren mit der Benutzeroberfläche auch während das Meldungsfeld angezeigt wird., was ich sagen muss, ist "ungewöhnlich". Wenn ich Ihre Anforderung verstehe, ist das Meldungsfeld bereits aktiviert. Wenn dies noch aktiv ist, möchten Sie im Hauptfenster mit verschiedenen temporären Werten herumspielen. Inwiefern? Bis ein weiteres Meldungsdialogfeld erstellt wird? Das Meldungsfeld muss irgendwann verworfen werden.

Nicht nur das, aber wenn Sie ein nicht modales Meldungsfeld anzeigen und dann mit dem Hauptfenster interagieren, wird das Meldungsfeld wahrscheinlich nur hinter dem Hauptfenster verschwinden, ohnehin außer Sicht.

Ich würde vorschlagen, dass Meldungsfelder im Allgemeinen wie beabsichtigt behandelt werden - nur vorübergehende, temporäre modale Warnfelder, und dass Sie möglicherweise einen deutlich sichtbaren Live-Berichts- / Statusbereich in Ihrem Hauptfenster benötigen, anstatt eine nicht modale QMessageBox zu verwenden.

Hoffe das hilft

Grüße

Roger

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top