Qt for beginners Signals and slots 2: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
(Redirect to Qt for Beginners (Merged))
 
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
=Qt for beginners — Signals and slots 2=
#REDIRECT [[Qt for Beginners]]
 
[[Qt for beginners Signals and slots|<<< Signals and slots]] | [[Qt for beginners|Summary]] | [[Qt for beginners Exercise 1 basis|Exercise 1 : basis >>>]]
 
'''''Note:''' Unfortunately, the images are no longer available. See the official [http://doc.qt.io/qt-5/gettingstartedqt.html Getting Started with Qt Widgets] ''[qt.io]'' page for an alternative tutorial.''
 
This chapter covers the second part of signals and slots : implementing custom signals and slots.
 
Creating custom slots and signals is really simple. Slots are like normal methods, but with small decorations around. While signals needs little to no implementation at all.
 
==Creating custom signals and slots==
 
Creating custom signals and slots is very simple. It is described by the following checklist
 
* add '''Q_OBJECT''' macro
* add '''signals''' section, and write signals prototypes.
* add '''public slots''' or '''protected slots''' or '''private slots''' sections, and write slots prototypes.
* implement slots as normal methods.
* establish connections.
 
===Creating custom slots===
 
In order to implement a slot, we first need to make the class be able to send signals and have slots (see previous chapter). This is done by setting the '''Q_OBJECT''' macro in the class declaration (often in the header).
 
After that, a slot should be declared in the corresponding section, and implemented as a normal method.
 
Finally, slots are connected to signals.
 
===Creating signals===
 
As for slots, we first need to add the '''Q_OBJECT''' macro.
 
Signals should also be declared in the ''signals'' section, and there is no need for them to be implemented.
 
They are emitted using the '''emit''' keyword :
 
Note that in order to send signals that have parameters, you have to pass them in the signal emission
 
==Example==
 
===Creating custom slots===
 
Let’s start with our window with the button :
 
''window.h''<br />
 
''window.cpp''<br />
 
We might want to remove our previous connection that makes the application quit while clicking on the button. Now, we want that, when clicking on the button, the text is changed. More precisely, we want that the button can be ''checked'', and that, when checked, it displays “checked”, and when unchecked, it restores “Hello World”.
 
QPushButton does not implement such a specific slot, so we have to implement it on our own. As stated previously, we have to add the '''Q_OBJECT''' macro.
 
We also add our custom slot. Since we are trying to react from the button being checked, and since the corresponding signal is
 
we might implement a slot that has this signature :
 
Most of the time, by convention, we implement private and protected slots by prefixing them with “slot”. Here, we are not interested in exposing this slot as a public function, we can make it private. The new header is then
 
''window.h''<br />
 
The implementation of this slot is
 
We need to make the button checkable, and establish the connection, we have to add this code in the constructor :
 
The resulting code is then
 
''window.cpp''
 
And we should get this as a result
 
[[Image:7514610590_2a4e342dc4_m.jpg|Custom slot]]
 
==Emitting custom signals==
 
Based on the previous example, we want to close the application if the button is clicked (checked or unchecked) 10 times. We first need to implement a counter that will count the number of clicks. These modifications implement it
 
and
 
Now, we have to create a custom signal that is used to notify other components, that the counter has reached 10. In order to declare a signal, we have to add a <code>signals</code> section in the header. We might also declare a signal with the following signature
 
The header class is then declared as followed
 
Even if the signal is declared as a method, there is no need to implement it. The meta-object compiler is used to do this.
 
Now we need to emit the signal when the counter reaches 10. It is simply done in the slot
 
We need to write the keyword '''emit''' to send the signal.
 
Connecting the newly created signal to the <code>quit</code> slot is done as usual
 
The final code is
 
''window.h''<br />
 
''window.cpp''<br />
 
And you can try and check that after clicking the button ten times, the application will quit.
 
==Troubleshooting==
 
While compiling your program, especially when you are adding the macro Q_OBJECT, you might have this compilation error.
 
<code><br /> main.cpp:(.text._ZN6WindowD2Ev[_ZN6WindowD5Ev]+0×3): undefined reference to `vtable for Window’<br /></code>
 
This is because of the meta-object compiler not being run on a class that should have meta-object. You should '''rerun qmake''', by doing Build &gt; Run qmake.
 
[[Qt for beginners Signals and slots|&lt;&lt;&lt; Signals and slots]] | [[Qt for beginners|Summary]] | [[Qt for beginners Exercise 1 basis|Exercise 1 : basis &gt;&gt;&gt;]]
 
===Categories:===
 
* [[:Category:HowTo|HowTo]]
* [[:Category:Qt for beginners|Qt_for_beginners]]
* [[:Category:Tutorial|Tutorial]]

Latest revision as of 14:35, 5 May 2015

Redirect to: