Qt重力感應

來源:互聯網
上載者:User

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



完成!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.