Using Qt signals and slots vs calling a method directly
Signal/slot advantages:
- multiple slots can be connected to single signal, and you don't bother with allocating and freeing memory for this
- you can handle multithreading with this
Signal/slot drawbacks:
- a little slower than direct call
- significantly slower if the slot is virtual
- QObject is rather heavy thing, so you usually try to avoid constructing billions of them
More details are available here
Both approaches use signal-slot connections. In the first case, the connect
call is made by QMetaObject::connectSlotsByName()
called from setupUi
. In the second case, you explicitly call connect
yourself.
Also, the first approach is unnecessary in Qt5 when using C++11. You can modify the value in a lambda:
QObject::connect(ui->slider, &QAbstractSlider::valueChanged,
[this](int val){ ui->widget->setValue(val*2); });
To protect from deletion of ui->widget
, you should use a QPointer
:
class MyWindow : public QMainWindow {
QPointer<QAbstractSlider> m_widget;
...
public:
MyWindow(QWidget * parent = 0) : QMainWindow(parent) {
...
setupUi(this);
m_widget = ui->widget;
QObject::connect(ui->slider, &QAbstractSlider::valueChanged,
[this](int val)
{
if (!m_widget.isNull()) m_widget->setValue(val*2);
});
The overhead of signal-slot connections is quantified in this answer.
The main difference, in your example, of using a signal instead of a direct call, is to allow more than one listener.
If you directly call your widget setValue()
, then only that one widget will receive the C++ signal.
If you use a Qt signal, now any other object can connect to receive the event whenever it occurs.
If you do not foresee any other object to ever want to receive the value by signal, I would not bother with such. A direct call is definitively a lot faster (between 3 and 6 CPU instructions instead of dealing with strings to find receivers!), but as Paranaix mentioned, in a GUI it may not be much of an issue (although in this case it could become a problem on older computers if you send all those signals while moving the sliderbar.)