Qt——信号与槽


信号


限制

#   ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS
#     define slots Q_SLOTS
#     define signals Q_SIGNALS
#   endif
  • 声明信号要用关键字Q_SIGNALS/signals
  • Q_SIGNALS前面不可以加public、private、protected
  • 信号只要声明,可以不定义
  • 类型为void
  • 只有QObject类及其子类派生的类才可以使用信号和槽机制,所以需要在类声明的最开始加上Q_OBJECT
class Q_WIDGETS_EXPORT QAbstractButton : public QWidget
{
    Q_OBJECT
	
	Q_SIGNALS:
    void pressed();
    void released();
    void clicked(bool checked = false);
    void toggled(bool checked);
}

主动发射信号

emit signal(xx);


限制

  • 声明槽用Q_SLOTS/slots
  • Q_SLOTS前面可以加public、private、protected
  • 槽也可以被声明为虚函数
class Q_WIDGETS_EXPORT QAbstractButton : public QWidget
{
    Q_OBJECT

	public Q_SLOTS:
	    void setIconSize(const QSize &size);
	    void animateClick(int msec = 100);
	    void click();
	    void toggle();
	    void setChecked(bool);
}

信号和槽关联


有三种关联方式,见文章底部多窗口切换部分。而最主要的是connect函数。

原来的函数声明:

 bool QObject::connect(
	 const QObject *sender, 
	 const char *signal,
	 const QObject *receiver, 
	 const char *method,
	  Qt::ConnectionType = Qt::AutoConnection);

调用:

MyDialog *dlg = new MyDialog(this);
connect(dlg,SIGNAL(clicked(bool)),this,SLOT(setChecked(bool)));

注意

  • SIGNALSLOT两个宏可以将参数转化为const char*
  • 函数类型为bool,关联成功返回true
  • 信号和槽的参数只能有类型不能有变量,如clicked(bool checked)是错误的,否则编译可以通过,关联却不成功
  • 第五个参数Qt::ConnectionType表明关联方式
    Qt——信号与槽_第1张图片

Qt5中新加关联方式

static QMetaObject::Connection connect(
	const QObject *sender, 
	const char *signal,
	const QObject *receiver, 
	const char *member, 
	Qt::ConnectionType = Qt::AutoConnection
);

static QMetaObject::Connection connect(
	const QObject *sender, 
	const QMetaMethod &signal,
	const QObject *receiver, 
	const QMetaMethod &method,
	Qt::ConnectionType type = Qt::AutoConnection
);

inline QMetaObject::Connection connect(
	const QObject *sender, 
	const char *signal,
	const char *member, 
	Qt::ConnectionType type = Qt::AutoConnection
) const;

和前面主要有几大区别:

  • 指定信号和槽可以不用SIGNAL()SLOG()
  • 槽函数可以不再必须是slots/Q_SLOTS关键字声明的函数,只要是能和信号关联的成员函数就可以
  • 槽函数的参数数目 ≤ \leq 信号的参数数目

调用

connect(ui->findbutton,&QPushButton::clicked,this,&Widget::setChecked);

高级应用


  1. QObject::sender()函数可以返回发送该信号的对象指针
  2. 多信号关联到同一个槽,可以使用信号映射器QSignalMapper

你可能感兴趣的:(Qt学习入门,Qt,入门学习,信号和槽)