Qt之信号与槽

标签:
qt信号与槽qt信号与槽多信号 |
分类: Qt |
信号与槽的连接方式看起来会是这样的:
connect(sender,
SIGNAL(signal), receiver, SLOT(slot));
connect(sender, &Sender::signal, receiver,
&Receiver::slot);
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,
label,
&QLabel::setText);
好了,这些都是最基本的应用。那么多个信号连接同一个槽的时候如何进行区分呢?
方法一:
typedef
enum{
BUTTON_1,
BUTTON_2,
BUTTON_3,
BUTTON_4
}BUTTON;
void MyWidget::changeButton()
{
}
方法二:
QSignalMapper *signal_mapper = new QSignalMapper(this);
connect(push_button_1, &QPushButton::clicked,
signal_mapper, &QSignalMapper::map);
connect(push_button_2, &QPushButton::clicked,
signal_mapper, &QSignalMapper::map);
connect(tool_button_1, &QToolButton::clicked,
signal_mapper, &QSignalMapper::map);
connect(tool_button_2, &QToolButton::clicked,
signal_mapper, &QSignalMapper::map);
signal_mapper->setMapping(push_button_1, QString::number(BUTTON_1,
10));
signal_mapper->setMapping(push_button_2, QString::number(BUTTON_2,
10));
signal_mapper->setMapping(tool_button_1, QString::number(BUTTON_3,
10));
signal_mapper->setMapping(tool_button_2, QString::number(BUTTON_4,
10));
connect(signal_mapper, &QSignalMapper::mapped,
this, &MyWidget::changeButton);
void MyWidget::changeButton(QString
text)
{
}
执行顺序
如:
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);
注:
前一篇:Qt之再谈阴影边框