Signal and Slots :: emit()
-
Hi , I have gone through the documentation, and spent some times to understand how is the magic work between signal and slots. So far, I have already understood the signal and slots on high level abstraction. However, this "emit" pseudo-keyword is really confusing for novice guy like me. Some said its a syntactic sugar, some said there is a moc -object that works with emit(). I wanted to know how,where, when , why to apply this emit() pseudo -keyword . Perhaps we can start with the example provided in the documentation.
void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } }
Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); a.setValue(12); // a.value() == 12, b.value() == 12 b.setValue(48); // a.value() == 12, b.value() == 48
From what i understand from that code. valueChanged() this function will "track" has "m_value" changed to new value yet? If yes , then "send" the signal to the setValue this SLOT to perform operation . is my interpretation correct? if yes, why still to implement "emit valueChanged(value) " in the SLOT function ? else please correct my interpretation .Thank you
-
Hi
the class Counter will emit valueChanged signal when setValue is called.So in this case, Object A will tell object B that value was changed.
In a real program, B might be main and A some dialog,
Signals are used to indicate to other classes that something has happen.
Can also give the data.So we need valueChanged() to tell the world , not to set the value or anything else.
Just in this case it calls setValue. IN most other case. something else would happen in slot. -
Hi , I have gone through the documentation, and spent some times to understand how is the magic work between signal and slots. So far, I have already understood the signal and slots on high level abstraction. However, this "emit" pseudo-keyword is really confusing for novice guy like me. Some said its a syntactic sugar, some said there is a moc -object that works with emit(). I wanted to know how,where, when , why to apply this emit() pseudo -keyword . Perhaps we can start with the example provided in the documentation.
void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } }
Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); a.setValue(12); // a.value() == 12, b.value() == 12 b.setValue(48); // a.value() == 12, b.value() == 48
From what i understand from that code. valueChanged() this function will "track" has "m_value" changed to new value yet? If yes , then "send" the signal to the setValue this SLOT to perform operation . is my interpretation correct? if yes, why still to implement "emit valueChanged(value) " in the SLOT function ? else please correct my interpretation .Thank you
Hi,
@QT_QT_QT said:
However, this "emit" pseudo-keyword is really confusing for novice guy like me.
This is the perfect blog article for you: http://woboq.com/blog/how-qt-signals-slots-work.html
Some said its a syntactic sugar, some said there is a moc -object that works with emit(). I wanted to know how,where, when , why to apply this emit() pseudo -keyword .
Here's the trick:
emit
is a C++ macro. It is defined as... *drumroll*... an empty string! See https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qobjectdefs.h.html#_M/emitThe example will work exactly the same if your code looks like this:
void Counter::setValue(int value) { if (value != m_value) { m_value = value; valueChanged(value); } }
"Emitting a signal" == "calling a function". When you call a signal function, it goes through the list of connected slots, and calls the slot functions.
Where is this signal function defined? Remember, you declared the signal as a function in the header, but you didn't implement the function body. The body is generated by
moc
. After you build your project, have a look in the build folder. You'll find a file likemoc_counter.cpp
.From what i understand from that code. valueChanged() this function will "track" has "m_value" changed to new value yet?
No. Nobody is tracking
m_value
.The signal is only emitted when someone calls the
valueChanged()
function.