在Qt工程中,一个类若要支持信号和槽,就必须从 QObject 或 QObject 的子类继承,同时需要在头文件类声明的开头引入 Q_OBJECT 宏。
信号和槽的连接使用connect:
connect(const QObject *sender,
PointerToMemberFunction signal,
const QObject *receiver,
PointerToMemberFunction method,
Qt::ConnectionType type=Qt::AutoConnection);
connect(const QObject *sender,
PointerToMemberFunction signal,
Functor functor);
/* Lambda expression can also be used. */
Example:
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, QLabel::setText);
若在发送者类中信号存在重载,连接信号需要使用 QOverload< >::of( )或 static_cast<>()来指定类型。例如在 QComboBox 中关于currentIndexChanged有两个信号:
void QComboBox::currentIndexChanged(const QString &text)
void QComboBox::currentIndexChanged(int index)
connect(comboBox,
QOverload<const QString &>::of( &QComboBox::currentIndexChanged),
[=](const QString &text){ /* ... */ });
connect(comboBox,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
[=](int index){/* ... */});
题图来自Pixabay.