qt:wiring_up_signals_and_slots
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
qt:wiring_up_signals_and_slots [2011/03/31 12:25] – mithat | qt:wiring_up_signals_and_slots [2011/04/03 13:14] (current) – mithat | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Wiring up signals and slots ====== | ====== Wiring up signals and slots ====== | ||
- | Qt uses a signals and slots system to process events. If you use Qt Creator for development, | ||
- | ===== Create an "event handler" | + | ===== Creating signal→slot connections ===== |
- | // | + | Qt uses a [[signals and slots]] system to process events. There are at least four different ways to make signal-> |
+ | * [[#Create an "event handler" | ||
+ | * [[#Do it " | ||
+ | * [[#Do it in the *.ui file]] | ||
+ | * [[#Do it in the constructor ]] | ||
+ | |||
+ | Each of the above listed approaches and when they are available are discussed below. | ||
+ | |||
+ | ==== The alternatives ==== | ||
+ | |||
+ | === Create an "event handler" | ||
+ | // | ||
Users of Visual Studio, Delphi, and Lazarus will be most familiar with this approach. In Qt Creator, right click on a control and select //Go to slot ...//. A dialog box giving you a list of signals available for the control will appear; select the signal for which you wish to create a handler. If the handler doesn' | Users of Visual Studio, Delphi, and Lazarus will be most familiar with this approach. In Qt Creator, right click on a control and select //Go to slot ...//. A dialog box giving you a list of signals available for the control will appear; select the signal for which you wish to create a handler. If the handler doesn' | ||
A handler you make this way for a '' | A handler you make this way for a '' | ||
- | <code cpp> | + | <code cpp-qt> |
void MainWindow:: | void MainWindow:: | ||
{ | { | ||
Line 15: | Line 25: | ||
The handlers you create this way are actually a private slots. You can confirm this by looking at the header file for the class you are editing: | The handlers you create this way are actually a private slots. You can confirm this by looking at the header file for the class you are editing: | ||
- | <code cpp> | + | <code cpp-qt> |
private slots: | private slots: | ||
void on_button_quit_clicked();</ | void on_button_quit_clicked();</ | ||
- | ==== Behind the scenes ==== | + | == Behind the scenes == |
+ | How does the build system know that that '' | ||
+ | <code cpp-qt>< | ||
- | How does the build system know that that '' | + | == Question == |
+ | If the above is true, then it should be possible | ||
+ | * Write the handlers manually in Qt Creator. | ||
+ | * Write the handlers manually in a project managed by something other than Qt Creator. | ||
+ | I've done both and assuming I didn't overlook something, indeed you can hand-add handlers as suggested. | ||
- | ===== Do it visually | + | === Do it "visually" |
// | // | ||
Line 33: | Line 49: | ||
* toolbar icon: (figure it out from the menu icon) | * toolbar icon: (figure it out from the menu icon) | ||
- | In this mode, you will notice that when you roll over widgets, they turn red and get a thick border. This tells you they are providers of signals. To make a signal/slot connection | + | In this mode, you will notice that when you roll over widgets, they turn red and get a thick border. This tells you they are providers of signals. To make a signal/slot connection: |
- Roll over the widget that will provide the signal. | - Roll over the widget that will provide the signal. | ||
- Click and drag to the widget whose slot you want to connect to. | - Click and drag to the widget whose slot you want to connect to. | ||
Line 39: | Line 55: | ||
- From the dialog that appears, select the desired signal from the left column and the desired slot from the right and click OK. | - From the dialog that appears, select the desired signal from the left column and the desired slot from the right and click OK. | ||
- | If you don't see a slot that you expect, try clicking on the "Show slots inherited from ..." checkbox. IMHO, this should be checked by default, but isn' | + | If you don't see a slot that you expect, try clicking on the "Show slots inherited from ..." checkbox. IMHO, this should be checked by default, but it isn' |
When you set signal/slot connections this way, you will see arrows connecting widgets indicating signal/slot relationships. | When you set signal/slot connections this way, you will see arrows connecting widgets indicating signal/slot relationships. | ||
- | ==== Special cases ==== | + | == Special cases == |
There are a couple special cases that are worth mentioning. | There are a couple special cases that are worth mentioning. | ||
- | === Connecting to the window | + | **Connecting to the window** |
If you want to connect a signal to the slot of a window, just drag onto the window rather than onto another widget. You will know you are connecting to the main window because the slot end of the connector will turn into an electrical earth ground symbol {{: | If you want to connect a signal to the slot of a window, just drag onto the window rather than onto another widget. You will know you are connecting to the main window because the slot end of the connector will turn into an electrical earth ground symbol {{: | ||
- | === Connecting a widget to itself | + | **Connecting a widget to itself** |
You can also connect widgets to themselves. If you do this, you can set up all sorts of hilarity. Sometimes you can even do useful things. | You can also connect widgets to themselves. If you do this, you can set up all sorts of hilarity. Sometimes you can even do useful things. | ||
- | ==== Editing signals and slots ==== | ||
+ | == Editing signals and slots == | ||
You can edit existing signal/slot connections made in Edit Signal/ | You can edit existing signal/slot connections made in Edit Signal/ | ||
You can add new relationships and delete existing ones using the **+** and **–** icons. The **–** icon seems a bit temperamental, | You can add new relationships and delete existing ones using the **+** and **–** icons. The **–** icon seems a bit temperamental, | ||
- | ==== Behind the scenes | + | == Behind the scenes == |
Connections made this way are stored in a form's ''//< | Connections made this way are stored in a form's ''//< | ||
< | < | ||
Line 79: | Line 95: | ||
Note: If you are using Qt Creator to develop your project, the Qt gods discourage you from manually editing '' | Note: If you are using Qt Creator to develop your project, the Qt gods discourage you from manually editing '' | ||
- | ===== Do it in the *.ui file ===== | + | === Do it in the *.ui file === |
// | // | ||
- | If your project uses '' | + | If your project uses '' |
- | + | <code xml> | |
- | ===== Do it in the constructor | + | < |
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | === Do it in the constructor === | ||
// | // | ||
+ | You can explicitly connect signals and slots programatically. This is typically done in a form's constructor. | ||
+ | |||
+ | <code cpp-qt> | ||
+ | HelloForm:: | ||
+ | { | ||
+ | widget.setupUi(this); | ||
+ | |||
+ | connect(widget.button_quit, | ||
+ | }</ | ||
+ | |||
+ | ==== Recommendation ==== | ||
+ | While the [[#Create an "event handler" | ||
+ | |||
+ | ===== Runtime signal→slot connection modifications ===== | ||
+ | I don't know. But it should be possible. |
qt/wiring_up_signals_and_slots.txt · Last modified: 2011/04/03 13:14 by mithat