在遇到多信号问题的时候,你是否经常会连接多个槽函数呢?如果你的答案是绝对的,那么你已经Out很久了。多信号连接多个槽,实现不同的槽就在潜意识的加大程序的开销!那么为什么不去链接同一个槽呢? 信号与槽的连接方式看起来会是这样的:
Qt5之前:
Qt5开始:
前者:
后者:
1、一个信号连接一个槽
2、一个信号连接多个槽
3、多个信号连接同一个槽
4、一个信号连接另一个信号
5、断开链接
1、bool QObject::disconnect(const QObject * receiver,
const char * method = 0) const
断开所有发送者的信号与接受者槽的连接
2、bool QObject::disconnect(const char * signal = 0, const
QObject * receiver = 0, const char * method = 0) const
断开发送者和接受者的连接
3、bool QObject::disconnect(const QObject * sender, const char
* signal, const QObject * receiver, const char * method)
[static]
断开通常用于以下三种方式:
(1)断开所有连接到该对象的信号
disconnect(myObject, 0, 0, 0);
相当于非静态重载函数
myObject->disconnect();
(2)断开一切连接到特定信号:
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
相当于非静态重载函数
myObject->disconnect(SIGNAL(mySignal()));
(3)断开一个特定的接收者:
disconnect(myObject, 0, myReceiver, 0);
相当于非静态重载函数
myObject->disconnect(myReceiver);
4、bool QObject::disconnect(const QObject * sender, const
QMetaMethod & signal, const QObject * receiver, const
QMetaMethod & method) [static]
5、bool QObject::disconnect(const QMetaObject::Connection &
connection) [static]
6、bool QObject::disconnect(const QObject * sender,
PointerToMemberFunction signal, const QObject * receiver,
PointerToMemberFunction method) [static]
断开通常用于以下三种方式:
(1)断开所有连接到该对象的信号
disconnect(myObject, 0, 0, 0);
(2)断开一切连接到特定信号:
disconnect(myObject, &MyObject::mySignal(), 0, 0);
(3)断开一个特定的接收者:
disconnect(myObject, 0, myReceiver, 0);
(4)断开一个特定信号到特定槽的连接:
QObject::disconnect(lineEdit, &QLineEdit::textChanged,
好了,这些都是最基本的应用。那么多个信号连接同一个槽的时候如何进行区分呢?
方法一:
typedef
enum{
BUTTON_1,
BUTTON_2,
BUTTON_3,
BUTTON_4
}BUTTON;
void
{
}
方法二:
QSignalMapper *signal_mapper = new QSignalMapper(this);
connect(push_button_1,
connect(push_button_2,
connect(tool_button_1,
connect(tool_button_2,
signal_mapper->setMapping(push_button_1,
signal_mapper->setMapping(push_button_2,
signal_mapper->setMapping(tool_button_1,
signal_mapper->setMapping(tool_button_2,
connect(signal_mapper,
void
{
}
本人补充:方法三 利用QT5最新的信号-槽连接语法,以及C++11的lamba表达式,很容易实现槽函数的参数传递: connect(ui.actionDefaultEngine, &QAction::triggered, this, [this](){return SelectSliceEngine(0,m_nSelectEngine); }); connect(ui.actionCuraEngine, &QAction::triggered, this, [this](){return SelectSliceEngine(1,m_nSelectEngine); }); connect(ui.actionSlicerEngine, &QAction::triggered, this, [this](){return SelectSliceEngine(2,m_nSelectEngine); }); 上面是三个信号连接到同一个槽函数,利用传入的第一个参数表示不同的信号源,lambda表达式简单直观! 执行顺序
如:
connect(slider,
&QSlider::valueChanged, spin_box,
&QSpinBox::setValue);
connect(slider,
&QSlider::valueChanged, this,
&QWidget::showValue);
A signal can be connected to many slots and signals. Many
signals can be connected to one slot.
If a signal is connected to several slots, the slots are
activated in the same order in which the connections were made,
when the signal is emitted.(一个信号连接多个槽,信号发射后,会按照链接顺序执行)。
connect(spin_box,
&QSpinBox::valueChanged, this,
&ListView::changeValue);
信号与槽连接看上去很正确,但是会出现如下错误:
connect(spin_box,
static_cast(&QSpinBox::valueChanged), this,
&ListView::changeValue);
|
|
来自: herowuking > 《QT》