Seite 1 von 1

Qmessagebox

Verfasst: 22. Februar 2013 16:20
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

Re: Qmessagebox

Verfasst: 22. Februar 2013 16:46
von veeman
Kommt drauf an wie du die erstellst und anzeigst.

Mfg veeman

Re: Qmessagebox

Verfasst: 22. Februar 2013 16:55
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

Re: Qmessagebox

Verfasst: 22. Februar 2013 17:12
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

Re: Qmessagebox

Verfasst: 22. Februar 2013 17:23
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

Re: Qmessagebox

Verfasst: 22. Februar 2013 17:50
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

Re: Qmessagebox

Verfasst: 22. Februar 2013 18:12
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.

Re: Qmessagebox

Verfasst: 22. Februar 2013 18:19
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

Re: Qmessagebox

Verfasst: 22. Februar 2013 19:14
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