QT按键增加按键音代码功能,代码如下:
然后在按键类的构造函数里将播放音乐的信号和槽联系起来即可:
void QKeyPushButton::mouseReleaseEvent(QMouseEvent *event)
{
QPushButton::mouseReleaseEvent(event);
mplay->execute(program,arguments); //此处调用"aplay click.wav"播放按键音文件
}
但是这样会导致一个现象,即在按键过快按下的时候,按键音延迟响应,给人一种“卡”的感觉,在此采用了单例模式的设计方法解决了该问题。关键代码如下:
class QKeythread : public QObject//单例类定义
{
Q_OBJECT
public:
static QKeythread* GetInstance();
public slots:
void play_key_sound(void);
void play_sound_slot(void);
private:
QKeythread();
static QKeythread *m_keyDeal;
QProcess *mplay;
QString program;
QStringList arguments;
};
QKeythread * QKeythread::m_keyDeal = NULL;
QKeythread::QKeythread() //单例类构造函数
{
mplay = new QProcess(this);
program = "aplay";
arguments<<SOUND_PATH;
}
QKeythread *QKeythread::GetInstance() //单例类静态实现方法
{
if(m_keyDeal == NULL)
{
m_keyDeal = new QKeythread;
}
return m_keyDeal;
}
void QKeythread::play_sound_slot() //播放按键音乐的槽函数
{
mplay->start(program,arguments);
}
然后在按键类的构造函数里将播放音乐的信号和槽联系起来即可:
QKeyPushButton::QKeyPushButton(QWidget *parent)
: QPushButton(parent)
{
this->setStyleSheet(QString(DEFAULT_STYLE_BUTTON) + QString(DEFAULT_BACKGROUND_BUTTON));
connect(this,SIGNAL(play_key_sound()),QKeythread::GetInstance(),SLOT(play_sound_slot()));
}
采用这种方法的原理可以概括如下:按键过快时,按键事件仍全部响应,而按键音播放事件则有选择的响应。