自訂信號槽函式

除了Qt預設的signal和slot函式,我們也可以自訂signal和slot函式,這邊用QLCDNumber來顯現QSlider的值,以下是我們元件的訊息傳播流程:

  1. 拉動QSlider時,發出一個Qt內建的signal函式,這時用自訂的slot函式,也就是setValue(int)去響應。
  2. 如果此時的QSlider值和內存的值不同,就發出自訂的signal函式,也就是valueChanged(int)。
  3. 接著用QLCDNumber的display()函式去響應此訊息,將值顯現在QLCDNumber元件上。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLCDNumber>
#include <QSlider>

class Widget : public QWidget
{
Q_OBJECT

public:
    Widget(QWidget *parent = 0);
public slots:
    void setValue(int);
signals:
    void valueChanged(int);
private:
    int m_value;
    QLCDNumber *myLcd;
    QSlider *mySlider;
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    m_value = 0;
    myLcd = new QLCDNumber(this);
    myLcd->setGeometry(80, 30, 150, 50);
    mySlider = new QSlider(Qt::Horizontal, this);
    mySlider->setRange(0, 9999);
    mySlider->setValue(0);
    mySlider->setGeometry(80, 110, 150, 50);
    connect(mySlider, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
    connect(this, SIGNAL(valueChanged(int)), myLcd, SLOT(display(int)));
}
void Widget::setValue(int value) {
    if (value != m_value) {
        m_value = value;
        emit valueChanged(m_value);
    }
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(300,200);
    w.setWindowTitle(QObject::tr("信號槽範例"));
    w.show();
    return a.exec();
}

Signal&Slot

Signal&Slot


  • 自建的signal和slot函式回傳值皆為void,且參數基本上要相同(本例為int),若signal的參數多於slot的參數,則額外的參數會被slot忽略。