Qmessagebox

Alles rund um die Programmierung mit Qt
Antworten
ritec
Beiträge: 5
Registriert: 22. Februar 2013 15:35

Qmessagebox

Beitrag von ritec »

Hallo Gemeinde,
ich komme nicht drauf, wie man eine QMessagebox auf Existenz abfragt.
Ich möchte verhindern, das die Messagebox noch einmal geladen wird, wenn sie schon präsent ist.
greezi
ritec
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Qmessagebox

Beitrag von veeman »

Kommt drauf an wie du die erstellst und anzeigst.

Mfg veeman
ritec
Beiträge: 5
Registriert: 22. Februar 2013 15:35

Re: Qmessagebox

Beitrag von ritec »

Hallo veeman,
vorerst, wie hier dargestellt.

Code: Alles auswählen

QMessageBox::information(this, tr("Nachrichten-Info"),
                             tr("Es sind immer noch ungelesene Nachrichten vorhanden!"),
                             (QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok);
Gruss ritec
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Qmessagebox

Beitrag von veeman »

In der hinsicht ist es nicht möglich und auch nicht nötig zu prüfen ob dieses present ist, da solange dieses angezeigt wird,
alle weiteren Fenster sowieso blockiert werden.

Mfg veeman
ritec
Beiträge: 5
Registriert: 22. Februar 2013 15:35

Re: Qmessagebox

Beitrag von ritec »

Hallo veeman,
es gibt im bestehenden sehr umfangreichen code ein tool, welches im hintergrund zeitgesteuert alle zeit x eine Resourcenabfrage durchführt und bei,
wie in diesem fall, vorhandener neuer nachrichten die o.g. Qmessagebox öffnet.
Wird die Qmessagebox vom anwender nicht geschlossen, weil er womöglich einige zeit nicht vor dem rechner sitzt, haben wir dann mal ebend
30, 50 oder auch 200 Qmessageboxen am start.
Das soll verhindert werden.
gruss ritec
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Qmessagebox

Beitrag von veeman »

Ahso, ok dann müsst er es ein wenig anders Lösen.

Die einfachste Lösung wäre einfach ne bool Variable zu verwenden um zu schauen ob das Fenster angezeigt wird.

Code: Alles auswählen

if (!visible) {
  visible = true;
  QMessageBox::information(..)
  visible = false;
}
Wenn ihr mit Threads arbeitet sollte die obige Konstellation mit einem QMutex geschützt werden.

Eine andere Möglichkeit könnte sein dass man einfach nach einem QMessageBox Kindobject zu suchen.

Code: Alles auswählen

if (this->findChildren<QMessageBox*>().count())
 .... // Message Box vorhanden
Wie erfolgt die Aktualisierung? Timer? Thread?

Mfg veeman
dazedly
Beiträge: 197
Registriert: 3. Oktober 2010 15:38
Kontaktdaten:

Re: Qmessagebox

Beitrag von dazedly »

Leitet sie ab und macht sie static.

In den Konstruktor:

Code: Alles auswählen

	if ( MessageBox::instance == NULL )
	{
		MessageBox::instance = this;
	} else {
		throw std::runtime_error ( "Double initialisation Interface" );
	}

Im Destructor:

Code: Alles auswählen

MessageBox::instance = NULL;
Im Body:

Code: Alles auswählen

MessageBox* MessageBox::getInstance()
{
	return instance;
}
Ganz unten in den Body:

Code: Alles auswählen

MessageBox* MessageBox::instance = NULL;
Im Header

Code: Alles auswählen

public:
       static MessageBox* getInstance();
private:
       static MessageBox* instance;
Jetzt kannst du mit:

Code: Alles auswählen

if(MessageBox::getInstance())
{
        MessageBox::getInstance()->show (); // show
}
else
{
       new MessageBox();
       MessageBox::getInstance()->show ();
}
        // new
deine Messagebox erstellen, falls es sie noch nicht gibt.
Zuletzt geändert von dazedly am 22. Februar 2013 18:40, insgesamt 1-mal geändert.
ritec
Beiträge: 5
Registriert: 22. Februar 2013 15:35

Re: Qmessagebox

Beitrag von ritec »

Hallo veeman, hallo dazedly,
die aktualisierungen laufen über einen timer.
Danke für die vorschläge!
Ich verarbeite das mal und gebe feedback!

beste grüsse
ritec
ritec
Beiträge: 5
Registriert: 22. Februar 2013 15:35

Re: Qmessagebox

Beitrag von ritec »

Hallo veeman,
die idee mit der boolschen variable funktioniert so nicht.
Mit der Umsetzung der Idee der Abfrage des QMessageBox Kindobjectes kann ich schon mal einen Erfolg vermelden.
Danke dafür!

Hallo dazedly,
deinen vorschlag prüfe ich ebenfalls und gebe ein feedback dazu.
Auch dafür schon mal besten dank!

beste gruesse

ritec
Antworten