Signals and Slots in Depth

Slots are almost identical to ordinary C++ member functions. They can be virtual; they can be overloaded; they can be public, protected, or private; they can be directly invoked like any other C++ member functions; and their parameters can be of any types. The difference is that a slot can also be connected to a signal, in which case it is automatically called each time the signal is emitted.

The connect() statement looks like this:

connect(sender
, SIGNAL(signal
), receiver
, SLOT(slot
));

 

where sender and receiver are pointers to QObject s and where signal and slot are function signatures without parameter names. The SIGNAL() and SLOT() macros essentially convert their argument to a string.

 

In the examples we have seen so far, we have always connected different signals to different slots. There are other possibilities to consider.

  • One signal can be connected to many slots:

    connect(slider, SIGNAL(valueChanged(int)),
    spinBox, SLOT(setValue(int)));
    connect(slider, SIGNAL(valueChanged(int)),
    this, SLOT(updateStatusBarIndicator(int)));

    When the signal is emitted, the slots are called one after the other, in an unspecified order.

  • Many signals can be connected to the same slot:

    connect(lcd, SIGNAL(overflow()),
    this, SLOT(handleMathError()));
    connect(calculator, SIGNAL(divisionByZero()),
    this, SLOT(handleMathError()));

    When either signal is emitted, the slot is called.

  • A signal can be connected to another signal:

    connect(lineEdit, SIGNAL(textChanged(const QString &)),
    this, SIGNAL(updateRecord(const QString &)));

    When the first signal is emitted, the second signal is emitted as well. Apart from that, signal–signal connections are indistinguishable from signal–slot connections.

  • Connections can be removed:

    disconnect(lcd, SIGNAL(overflow()),
    this, SLOT(handleMathError()));

    This is rarely needed, because Qt automatically removes all connections involving an object when that object is deleted.

To successfully connect a signal to a slot (or to another signal), they must have the same parameter types in the same order:

connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),
this, SLOT(processReply(int, const QString &)));

 

Exceptionally, if a signal has more parameters than the slot it is connected to, the additional parameters are simply ignored:

connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),

this, SLOT(checkErrorCode(int)));

If the parameter types are incompatible, or if the
signal or the slot doesn't exist, Qt will issue a warning at run-time
if the application is built in debug mode. Similarly, Qt will give a
warning if parameter names are included in the signal or slot
signatures.
So far, we have only used signals and slots with widgets. But the mechanism itself is implemented in QObject and isn't limited to GUI programming.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值