Qt重力感應
今天我們介紹一下Qt的重力感應功能,我們會寫一個小程式,即時檢測重力感應的x,y,z三個數值並顯示在螢幕中,最後我們把它放在我的Nokia 5230手機裡運行:
強烈建議參考:http://apidocs.meego.com/1.1/core/html/qtmobility/sensors-api.html
另外也可以參考(這篇有點多,涉及到了很多方面):
http://www.developer.nokia.com/Community/Wiki/Qt_Mobility_example_application:_Fall_Detector
貼幾張圖,一目瞭然:
1.
首先建立一個“Qt Gui 應用”,輸入MySensor:
2.
選擇“塞班裝置”:
3.
選擇“QWidget”:
建立完成!
4.
修改widget.ui如下,我們加入了一個PushButton,id為btnStart;下方有一個Plain Text Edit,id為textData。第一次按下btnStart時,標題變為Pause,同時開始記錄重力感應的x,y,z三軸資料,顯示在textData中,同時傳遞給PC。再按下btnStart時,暫停記錄,如此反覆。
5.
Qt的感應器包括重力,光線,方向等。我們在使用感應器時應該先定義一個感應器對象,然後定義一個繼承自QSensorFilter的類,實現其中的filter方法(這個方法在QSensorFilter中被定義為virtual),每當感應器的資料發生變化時就會調用這個函數,最後我們把感應器對象和這個filter連在一起就可以了。
需要說明的是,每個不同的感應器都對應一個類,如QAccelerometer類是重力感應器類,QAmbientLightSensor是光線感應器類等。但所有感應器類都繼承自一個共同的父類:QSensor,所以我們使用感應器類時比較簡單的方法是使用專用的感應器類,而不要再使用QSensor類了。另外filter也是一樣,所有的感應器filter都繼承自一個共同的父類QSensorFilter。所以我們自訂的filter類也應該繼承自專用的filter類,而不要再繼承QSensorFilter類了。
原理很簡單,下面我們開始吧:
1.
首先我們定義一個filter類,繼承自QAccelerometerFilter,並實現其中的filter方法。為項目新增一個MyFilter類,如下:
2.
修改myfilter.h如下:
#ifndef MYFILTER_H#define MYFILTER_H#include <QPlainTextEdit>#include <QAccelerometerFilter>/* Neccessary for Qt Mobility API usage */QTM_USE_NAMESPACEclass MyFilter : public QAccelerometerFilter{public: MyFilter(QPlainTextEdit * text);private: QPlainTextEdit * text;protected: bool filter(QAccelerometerReading * reading);};#endif // MYFILTER_H
注意:QTM_USE_NAMESPACE表示使用Qt Mobility的命名空間,感應器屬於Qt Mobility API,因此我們需要加入這句。另外,我們也加入了filter方法的聲明,text是主介面的Plain Text Edit,便於我們在filter中修改它的內容。
3.
修改myfilter.cpp如下:
#include <QDebug>#include <QAccelerometerReading>#include "myfilter.h"MyFilter::MyFilter(QPlainTextEdit * t){ text = t;}bool MyFilter::filter(QAccelerometerReading *reading){ qreal x = reading->x(); qreal y = reading->property("y").value<qreal>(); qreal z = reading->value(2).value<qreal>(); qDebug() << "x = " << x << ", y = " << y << ", z = " << z; QString str; str.sprintf("x: %f\ny: %f\nz: %f", x, y, z); text->setPlainText(str);}
注意:filter方法中我們用了三種方法擷取資料,第一種最快,第三種次之,第二種最慢,第三種的value按x,y,z為0,1,2次序編號。qDebug可以把資料直接發送到PC機上,同時我們也顯示在了Plain Text Edit中
4.
修改Widget.h如下:
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QAccelerometer>#include "myfilter.h"/* Neccessary for Qt Mobility API usage */QTM_USE_NAMESPACEnamespace Ui { class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui; QAccelerometer * sensor; MyFilter * filter; bool isRunning;private slots: void btnPressed();};#endif // WIDGET_H
5.
修改Widget.cpp如下:
#include "widget.h"#include "ui_widget.h"#include "myfilter.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); QObject::connect( ui->btnStart, SIGNAL(clicked()), this, SLOT(btnPressed())); isRunning = false; sensor = new QAccelerometer(this); filter = new MyFilter(ui->textData); sensor->addFilter(filter);}Widget::~Widget(){ delete ui; sensor->stop(); delete filter; delete sensor;}void Widget::btnPressed(){ if(isRunning) { sensor->stop(); ui->btnStart->setText("Start"); } else { sensor->start(); ui->btnStart->setText("Pause"); } isRunning = !isRunning;}
代碼較簡單,不過多解釋了,感應器主要的方法是start和stop,用addFilter將感應器和Filter連在一起
6.
最後修改MySensor.pro如下(注意,我們加入了MOBILITY = sensors,這句很重要):
#-------------------------------------------------## Project created by QtCreator 2012-06-06T12:58:51##-------------------------------------------------QT += core guiTARGET = MySensorTEMPLATE = appSOURCES += main.cpp\ widget.cpp \ myfilter.cppHEADERS += widget.h \ myfilter.hFORMS += widget.uiCONFIG += mobilityMOBILITY = sensorssymbian { TARGET.UID3 = 0xe4448359 TARGET.EPOCSTACKSIZE = 0x14000 TARGET.EPOCHEAPSIZE = 0x020000 0x800000}
7.
最後在項目選項卡中設定為自簽名就可以了
8.
串連手機,用Qt下載運行結果如下:
手機:
傳到PC機上的結果:
最後,我把代碼也上傳上來了:
http://download.csdn.net/detail/htttw/4355753
完成!