在程序中,通常一个按键被点击时,都会自动调用其相应的槽函数,这就不可避免地需要为每个按键定义一个槽函数。而当这些按键功能相近时,可以考虑使用一个槽函数来响应所有的按键点击信号,这可以避免定义过多的槽函数带来的累赘。但这产生了一个问题,即当多个信号与同一槽函数相连接,在信号触发时,槽函数并不能识别信号究竟是哪个按键触发的。
以下程序展示一个数字键盘来阐述信号映射的原理:
numerickeypad.h
#ifndef _NUMERICKEYPAD_H_
#define _NUMERICKEYPAD_H_
#include <QWidget>
class QPushButton;
class QLineEdit;
class NumericKeypad : public QWidget
{
Q_OBJECT
public:
NumericKeypad( QWidget * = 0 );
private slots:
void keyClicked( const QString & );
void setText( const QString & );
signals:
void textChanged( const QString & );
private:
QList< QPushButton * > keys;
QList< QString > allKeySymbol;
QString m_text;
QLineEdit *lineEdit;
};
#endif
为创建数字键盘,通常的做法是将所有的按键放在 QGridLayout中:
layout->addWidget( key1, 0, 0 );
layout->addWidget( key2, 0, 1 );
...
layout->addWidget( key0, 3, 1 );
layout->addWidget( keyClear, 3, 2 );