信號槽範例

Qt有些元件有預設的signal,當使用者進行這些操作時,會發生預設的信號,此時可用自己設計的函式,或是Qt預設的slot來響應此訊號,這邊示範兩個Qt訊號與槽的範例,第一個範例我們創建一個按鍵,當使用者點擊按鍵時會跳出對話框,第二個範例我們建立QLCDNumber和QSlider元件,當我們拉動QSlider時,QLCDNumber會顯現目前的QSlider值。


QPushButton 點擊信息

這邊為窗口建立一按鈕,按下按鈕時,會跳出對話框。


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QMessageBox>

class Widget : public QWidget
{
    Q_OBJEC
public:
    Widget(QWidget *parent = 0);
private:
    QPushButton *myBtn;
private slots:
    void showMessageBox();
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    myBtn = new QPushButton(this);
    myBtn->setText(tr("開啟對話框"));
    myBtn->setGeometry(55,80,100,30);
    connect(myBtn,SIGNAL(clicked()),this,SLOT(showMessageBox()));
}   
void Widget::showMessageBox(){
    QMessageBox::information(NULL,tr("消息框"),tr("按下按鈕"));
}

main.cpp

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

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

    return a.exec();
}

Signal&Slot

Signal&Slot

  • 只有繼承了QObject類別,才具有信號槽的能力,所以物件定義時,應該在第一行代碼寫上Q_OBJECT,這個巨集的展開,將為我們的物件提供信號槽機制、國際化機制等,很多操作都會依賴於這個巨集。這個巨集將由moc(可以將其理解為一種預處理器,是比C++預處理器更早執行)做特殊處理,moc會讀取標記了Q_OBJECT的頭文件,生成以moc_為前綴的文件,比如.cpp將生成moc_.cpp。
  • 這邊將slot函式(showMessageBox())當作成員函式,而signal函式為Qt元件預設的,connect()函式不另外宣告及定義,且等按鈕元件建立後,才使用connect()來連結signal和slot。
  • 槽函式在宣告時,必須註明此函式是槽函式,所以這邊在showMessageBox()之前加上private slots:。

QSlider 拉動信息

這邊我們為窗口建立兩個元件,QLCDNumber和QSlider,我們用Qt預設的元件函式當作signal和slot函式,當我們拉動QSlider時,QLCDNumber會顯現目前的QSlider值。


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);
private:
    QLCDNumber *myLcd;
    QSlider *mySlider;
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    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)), myLcd, SLOT(display(int)));
}

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(tr("信號槽範例"));
    w.show();

   return a.exec();
}

Sigal&Slot

Sigal&Slot