Qt Slot Signal
I found out today that Qt’s slots/signals architecture is even better than I thought. Normally, developers connect widget signals to widget slots to be notified of events. Today I discovered that signals can actually be connected to other signals, which saved me from writing some really stupid code…
Cross thread calls - If you're making a signal-slot connection that needs to be cross thread then QT will automatically buffer the signals and queue them to the right thread. This happens automatically for instance when a GUI thread needs to communicate to a working thread. Here's more information in QT's documentation. The Signal class provides a way to declare and connect Qt signals in a pythonic way. PySide adopt PyQt’s new signal and slot syntax as-is. The PySide implementation is functionally compatible with the PyQt 4.5 one, with the exceptions listed bellow.
This may seem weird, but consider this scenario. You have a custom widget, called MyWidget
, that has a signal, somethingClicked()
, which is emitted when a user clicks, uh, something. But now you want to add a QPopupMenu
as a right-click context menu, that causes the somethingClicked()
signal to be emitted also. It turns out there’s a hard way and an easy way to do this.
First, the hard way:
1. Add a new slot called emitSomethingClickedSlot()
that looks like this:
2. Then, connect the QPopupMenu
‘s menu item to this slot, like so:
That sucks. We just created a slot whose sole purpose is to turn around and emit a signal. What a waste of editor space. It would have been smarter to connect the menu item’s signal directly to the somethingClicked()
signal.
Here’s the easy way:
Now that’s concise. Sometimes it pays to connect signals to signals.
In this tutorial we will learn How to use signal and slots in qt.
File->New File or Project…
Applications->Qt Gui Application->Choose…
Python Qt Signal Slot
We keep the class as MainWindow as given by default.
SignalsAndSlots.pro
2 4 6 8 10 12 14 16 18 | #include 'ui_mainwindow.h' MainWindow::MainWindow(QWidget*parent): ui(newUi::MainWindow) ui->setupUi(this); connect(ui->horizontalSlider,SIGNAL(valueChanged(int)), disconnect(ui->horizontalSlider,SIGNAL(valueChanged(int)), } MainWindow::~MainWindow() delete ui; |
main.cpp
Qt Signal Slot With Parameters
Qt Signal Slot Between Classes
2 4 6 8 10 | #include <QApplication> intmain(intargc,char*argv[]) QApplicationa(argc,argv); w.show(); returna.exec(); |