[gelöst] Wie erstelle/versende ich eigene events?

Alles rund um die Programmierung mit Qt
Antworten
DarkSchwabe
Beiträge: 23
Registriert: 7. Juli 2008 11:57

[gelöst] Wie erstelle/versende ich eigene events?

Beitrag von DarkSchwabe »

Hallo allerseits,
ich bin neu hier und bei der Suche nach meiner Problemlösung auf das Forum gestoßen. Leider habe ich auch hier keine Antwort für mein Problem gefunden. Es sieht so aus, als hätten andere damit wohl kein Problem oder niemand benutzt eigene Events.

Hier mein Problem:

Ich habe ein Programm in Qt4 in welchem ich Signals und Slots verwende. Aufgrund dessen ist es wohl nicht schlau auch Exceptions zu benutzen. Nach langer Suche im Internet bin ich dann darauf gestoßen, dass man Exceptions in diesem Fall mit QEvents ersetzen sollte.
In der QT4 Doku steht, dass Userevents Enums sein müssen mit einem Wert zwischen 1000-65535.
Leider habe ich nirgends ein Beispiel gesehen wie man das macht.

Kann mir jemand zufällig ein kleines Beispiel geben wie das aussieht oder einen Link wo ein Beispiel steht?

Ich habe ein paar Versuche ins Blaue programmiert, aber bevor ich das hier poste würde ich gern wissen ob nicht jemand ein richtiges Beispiel hat wie man einen Userevent baut und nutzt :-) Denn mein Code ist mit Sicherheit falsch und ich kann kaum glauben dass es im Netz nirgends ein kleines Beispiel dazu hat.


Vielen Dank
und Grüße
Zuletzt geändert von DarkSchwabe am 11. Juli 2008 11:01, insgesamt 1-mal geändert.
DarkSchwabe
Beiträge: 23
Registriert: 7. Juli 2008 11:57

Beitrag von DarkSchwabe »

Morgen, da es so aussieht, als gäbe es da keinen Beispielcode werde ich mal meinen Code posten. Vielleicht sieht ja jemand einen Fehler:

Eigenen Event bauen:

Code: Alles auswählen

class QMyEvent : public QEvent
{
public :
   enum Type {anException = 1001};

public:
   QMyEvent(Type type);
   ~QMyEvent(){};
};
Senden des Events

Code: Alles auswählen

   QMyEvent myQEventTest(QMyEvent::anException);
   qAppl.sendEvent(0, (&myQEventTest));
Stimmt das soweit? Wenn ja, wie kann ich dann diesen Event abfangen?
Dafür nutzt man dann vermutlich den Eventfilter welchen man dann in einer Klasse implementieren muss in welcher man Zugriff auf das Objekt hat welches den Event sendet. Richtig?

Code: Alles auswählen

   qAppl.installEventFilter(&qAppl);
Das wars mal. Vielleicht kann ja jemand mein halbwissen vervollständigen oder Fehler korrigieren *G*

Danke
Gruß
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du must bei sendEvent einen Empfänger angeben und abfangen kannst du das ganze beim Empfänger mit QObject::event() oder QObject::eventFilter()
DarkSchwabe
Beiträge: 23
Registriert: 7. Juli 2008 11:57

Beitrag von DarkSchwabe »

upsala hat geschrieben:Du must bei sendEvent einen Empfänger angeben und abfangen kannst du das ganze beim Empfänger mit QObject::event() oder QObject::eventFilter()
Hmm.. woher weiß ich denn den Empfänger? Dann müsste ich der sendenden Funktion immer die Adresse der eventverarbeitende Klasse mitschicken? Ich hätte das eigentlich gerne wie bei den Exceptions, dass die Events einfach nach oben durchgereicht werden.
Kann es sein dass "Notify" damit etwas zu tun hat? Ich muss ehrlich zugeben, dass mich die Doku zu Notify etwas verwirrt.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Iher noch ein bespiel das bilder via event sendet an gegebene zeiten

Code: Alles auswählen


typedef struct {
	int alpha;
	QColor bg, fg, mg;
  int colortype;
	int compression;
  int bytedep;
  png_color_16p pngBG;
  bool foundcolor;
}  AFRAMES;


/* image sender event  */
class ImageEvent : public QEvent
{
	//QEvent::User==1000
public:
    ImageEvent( APNGFRAME gd )
	: QEvent( QEvent::User ),img(gd)
    {  }
 QImage frame() const { return img.item; }
 QByteArray psave() const { return img.dimg; }
 int time() const { return img.play; }
 QSize size() const { return img.maxframe.size(); }
private:
    APNGFRAME img;
};


/*¨sender */

void FrameReader::NextFrame()
{
    if (!running || movie.size() < 2) {
    return;
    }
		QObject *invoice = qobject_cast<QObject *>(sender());
		if (!invoice) {
		disconnect(this);
		QTimer::singleShot(200, this, SLOT(NextFrame()));
		return;
		}
		const int grab = qBound (0,current,movie.size() - 1);
		APNGFRAME im = movie[grab];
		cout <<  "ID " << grab << "from." << movie.size() << " time " << im.play << " l." << running_loop << "\r";
		fflush ( stdin );
		current++;
		current = qBound (1,current,movie.size());
		if (current == movie.size()) {
		current = 0;
		}
		if (parent) {
		qApp->postEvent(parent,new ImageEvent(im));
		disconnect(this);
		running_loop++;
		QTimer::singleShot(im.play, this, SLOT(NextFrame()));
		}
}


http://fop-miniscribus.googlecode.com/s ... nt.tar.bz2
.........................
speack português italiano deutsch english castellà qt
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hallo,

mir ist nicht klar, warum du das unbedingt mir Events machen willst...
Lässt sich das mit Signals&Slots nicht einfacher lösen?


Ciao,
Sephral
DarkSchwabe
Beiträge: 23
Registriert: 7. Juli 2008 11:57

Beitrag von DarkSchwabe »

Hallo,

danke für das Beispiel. Ich habs nun so einigermaßen durchschaut.
Aber wie "Sephral" angemerkt hat ist es vielleicht tatsächlich klüger dies mit Signals und Slots zu machen. Darum habe ich mich dafür entscheiden die Exceptions wenn möglich vor Ende der Slots abzuarbeiten (dann dürfte QT damit ja kein Problem haben) und den Rest werde ich dann wohl oder übel per Signals und Slots weitergeben.
UserEvents benutzt wohl kaum jemand und an einigen Stellen habe ich auch schon gelesen, dass man UserEvents lieber nicht benutzen sollte.
Also gibt es nun bei mir ein paar Signals und Slots mehr. Geht aber auch

Dankeschön für die Tipps. Ich erkläre das Problem damit mal als gelöst.

Gruß
DarkSchwabe
Antworten