Creating events instead of signals/slots
-
In his first reply, Gerolf already told you how to use custom events. -It doesn't matter much if you want to post your own event or a Qt event.- A QCloseEvent is just a subclass of QEvent that does not add any special members or methods.
I am not sure if posting your own QCloseEvent is going to work, since the spontaneous flag would be false. AFAIK, there is no public API to manipulate that flag, and I don't know if it would affect the handling of the event.
Edit: it turns out it does matter what kind of event you post.
-
[quote author="Andre" date="1301564768"]In his first reply, Gerolf already told you how to use custom events. It doesn't matter much if you want to post your own event or a Qt event. A QCloseEvent is just a subclass of QEvent that does not add any special members or methods.
[/quote]
I thinnk it will not. QCloseEvent is also a reaction on the close() slot (if close is no reaction to a system close event, there is an if in the code for that) :-).Sending a QCloseEvent will NOT close the widget!
@
... QWidget::event()
{
...
case QEvent::Close:
closeEvent((QCloseEvent *)event);
break;
...
}void QWidget::closeEvent(QCloseEvent *event)
{
event->accept();
}
@[quote author="Andre" date="1301564768"]
I am not sure if posting your own QCloseEvent is going to work, since the spontaneous flag would be false. AFAIK, there is no public API to manipulate that flag, and I don't know if it would affect the handling of the event.
[/quote]It's totaly internal, I was trying to use it once... Did not work. Needed it for a virtual key board.
-
Do I have a solution to close a widget from another widget of different classes using events?How could I do that?
-
As you need the widget pointer for sending events, you can just call close() method also. And it does the job. So why bother about sending events? Dou you need it asynchronous? Use QmetaObject::invokeMethod(...) with the queued invokation.
-
It should be synchronous with the close of the current widget and raise of other widget.
-
Then call
@
widget2()->show();
widget2()->raise();
widget1()->close();
@ -
I had already used it in my program and its working.My question is that can't we do the same by passing events between those widgets.in examples given in qt4,in mainwindows there is a sample program named application in which the QCloseEvent has been used but am not able take that and implement to my requirement.It throws a compile error as
@/usr/include/qt4/QtGui/qwidget.h:84: error: forward declaration of ‘struct QCloseEvent’
@Help me.
-
you should add the include for the QCloseEvent, it's only forward declared!
@
#include <QtGui/QCloseEvent>
@It's staed in the error message...
-
Thank You.That is clear now.How could I pass the event between two different widgets.Suppose if I had implementted the QCloseEvent in MainWindow then how to call that from my SubWindow?
-
to forward events to a parent, you can just use event->ignore() which should then send the take care that it is also send to the parent (don't know if that also happens to a CloseEvent).
-
Well!I have multiple screens.I need to display a particular screen based on the event I pass from my first screen.With signal and slot,I need to write those lines of code in all the files.Suppose if I have some 20 screens then by passing an event from my first screen I should display 10th(or 15th whatever) or close that particular window by having all my control in my first screen.
-
Then connect your signals to a slot/some slots in the first screen.
-
@Volker:I had done that earlier.How well can I organise these so as to have the control to close my other windows?Just like as we have goto in C.
-
It's the same task as if you had events dropping in.
EDIT:
And as C++ is a superset of C, you have goto - if you really want to use this. -
Can I traverse from 1st MainWindow to some 15th MainWindow that I have in my application?How well can I do this with signals?
-
What do you mean with "traverse"? Call each of them in sequence?
Of course you can do this. Qt does it all the time. Slots are invoked in the order the connections are created, so that would also "traverse".
-
The GUI should respond depending upon the event received from the C running as back-end.
-
OK, here's what I would do, and then I think I'll quit responding to this thread.
I would create a single QObject that is responsible for the communication with the C-based backend. This object receives the call-backs or events or whatever you call them from the backend, and emits corresponding signals for these events. The different windows connect to this object's signals to learn about the data they are interested in.
-
-
[quote author="Revu" date="1301986907"]@Andre:Thank you for your response.Could you explain the same with a code snippet please.So that I can understand better.[/quote]
Not without knowing what your back end looks like and how to communicate with it, no. And to be honest, I don't think I can or want to do that even if you provided the needed code and documentation. I think the concept should be clear though?