Seite 1 von 1

N9-00 Landscape drehen Portrait ohne QML

Verfasst: 1. April 2013 19:44
von Califax
Hallo
Hallo
Wie die Überschrift schon andeutet will ich ohne Verwendung von QML eine GUI nur mit C++ drehen.

Ich hab nun meiner Meinung fast alle Komponente zusammen.

1.Hardware Sensor auslesen.

Dadei: handy_lage.cpp

Code: Alles auswählen

#include "handy_lage.h"
Handy_Lage::Handy_Lage(QObject *parent) :
    QObject(parent),
    orientationSensor_wert(0)
{
     setupGeneral();
     QOrientationReading *orReading = orientationSensor->reading();
     orientationSensor_wert=orReading->orientation();
     updateOrientation();
     qDebug() << "Funktion :    Handy_Lage::Handy_Lage Wert : " << orientationSensor_wert ;
     connect(orientationSensor,SIGNAL(readingChanged()),SLOT(updateOrientation()));
     qDebug() << "Funktion :    Handy_Lage::Handy_Lage";
}
Handy_Lage::~Handy_Lage()
{
    delete orientationSensor;
}
void Handy_Lage::setupGeneral()
{
    // Initialise and start the orientation sensor
    orientationSensor = new QOrientationSensor(this);
    orientationSensor->start();
    if (!orientationSensor->isActive()) {
        qWarning("OrientationSensor didn't start!");
    }
    else
    {
    qDebug() << "Funktion :    Handy_Lage::setupGeneral" ;
    }
}
// Hier wird auf die Lage des Handy reagiert und der Lage entsprechender Wert ausgegeben
void Handy_Lage::updateOrientation()
{
    QOrientationReading *orReading = orientationSensor->reading();
    int i_tmpWert = orientationSensor_wert;
    switch (orReading->orientation())
    {
    case QOrientationReading::TopUp:     orientationSensor_wert = orReading->orientation(); break;
    case QOrientationReading::TopDown:   orientationSensor_wert = orReading->orientation(); break;
    case QOrientationReading::LeftUp:    orientationSensor_wert = orReading->orientation(); break;
    case QOrientationReading::RightUp:   orientationSensor_wert = orReading->orientation(); break;
    case QOrientationReading::FaceUp:    orientationSensor_wert = orReading->orientation(); break;
    case QOrientationReading::FaceDown:  orientationSensor_wert = orReading->orientation(); break;
    case QOrientationReading::Undefined: orientationSensor_wert = orReading->orientation(); break;
    default: orientationSensor_wert = 0;output = "Invalid enum value";
    }
    if (i_tmpWert != orientationSensor_wert)
    {
        qDebug() << "Der wert orientationSensor_wert: "<< orientationSensor_wert << " hat sich geändert WAS NUN?" ;
    }else
    {
        qDebug() << "Funktion :    Handy_Lage::updateOrientation" << orientationSensor_wert;
    }
}
int Handy_Lage::get_orientationSensor_wert()
{
    return orientationSensor_wert;
}
2.Dann die Ansicht N9-00 (Harmattan Speziefisch) drehen.

Datei: ansichtdrehen.cpp

Code: Alles auswählen

#include "ansichtdrehen.h"
#ifdef Q_OS_UNIX
#include <QX11Info>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#endif
// N9 Displaygröße in Pixeln
const int SCREEN_X = 480;
const int SCREEN_Y = 854;
enum MyOrientation
{
    // Hier sind die Werte in Grad(Winkel) angegeben
    // und um soviel Grad wird das View(Bild) gedreht
    // richtige Handylage(orientationSensor) zu View(Landscape)
    Landscape = 0,           //ist 4
    PortraitInverted = 90,   //ist 2
    LandscapeInverted = 180, //ist 3
    Portrait = 270           //ist 1
};
static void writeX11OrientationAngleProperty(QWidget* widget, MyOrientation orientation= Landscape)
{
#ifdef Q_WS_X11
    if (widget)
    {
        WId id = widget->winId();
        Display *display = QX11Info::display();
        if (!display) return;
        Atom orientationAngleAtom = XInternAtom(display, "_MEEGOTOUCH_ORIENTATION_ANGLE", False);
        XChangeProperty(display, id, orientationAngleAtom, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&orientation, 1);
    }
#endif
}
// Konstruktor
AnsichtDrehen::AnsichtDrehen(QWidget &Portrait ,QWidget &Landscape ,
                             int i_Geraetelage,QObject *parent):
    QObject(parent),
    w_Portrait(Portrait),
    w_Landscape(Landscape),
    int_Lage(i_Geraetelage)
{
    Pruefe_Lage();
    Portrait_oder_Landscape_Geometrie();
    Lage_festlegen();
    qDebug() << "Funktion :    AnsichtDrehen::AnsichtDrehen";
}
AnsichtDrehen::~AnsichtDrehen()
{
}
void AnsichtDrehen::Pruefe_Lage ()
{
    switch(int_Lage)
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
        break;
    default:
        int_Lage = 0;
    }
     qDebug() << "Funktion :    AnsichtDrehen::Pruefe_Lage";
}
void AnsichtDrehen::Portrait_oder_Landscape_Geometrie()
{
    if(int_Lage == 1 || int_Lage == 2)
    {
        //Portrait
        scene.setSceneRect(0,0,SCREEN_X,SCREEN_Y);
        scene.addWidget(&w_Portrait);
        view.setScene(&scene);
        view.setGeometry(0,0,SCREEN_X,SCREEN_Y);
    }
    else
    {
        if (int_Lage == 3 || int_Lage == 4 || int_Lage == 0)
        {
            //Landscape
            scene.setSceneRect(0,0,SCREEN_Y,SCREEN_X);
            scene.addWidget(&w_Landscape);
            view.setScene(&scene);
            view.setGeometry(0,0,SCREEN_Y,SCREEN_X);
       }
        else{
            //Landscape Standard
            qDebug() << "Funktion :    AnsichtDrehen::Portrait_oder_Landscape_Geometrie es wurde Landscape Standard ausgegeben.";
            scene.setSceneRect(0,0,SCREEN_Y,SCREEN_X);
            scene.addWidget(&w_Landscape);
            view.setScene(&scene);
            view.setGeometry(0,0,SCREEN_Y,SCREEN_X);
        }
    }
     qDebug() << "Funktion :    AnsichtDrehen::Portrait_oder_Landscape_Geometrie";
}
void AnsichtDrehen::Lage_festlegen()
{
    view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view.setStyleSheet( "QGraphicsView { border-style: none; }" );
    switch(int_Lage)
    {
    case 0 :
        writeX11OrientationAngleProperty(&view,Landscape);
        view.rotate(Landscape);
        break;
    case 1 :
        writeX11OrientationAngleProperty(&view,Portrait);
        view.rotate(Portrait);
        break;
    case 2 :
        writeX11OrientationAngleProperty(&view,PortraitInverted);
        view.rotate(PortraitInverted);
        break;
    case 3 :
        writeX11OrientationAngleProperty(&view,LandscapeInverted);
        view.rotate(LandscapeInverted);
        break;
    case 4 :
        writeX11OrientationAngleProperty(&view,Landscape);
        view.rotate(Landscape);
        break;
    }
    view.showFullScreen();
    qDebug() << "Funktion :    AnsichtDrehen::Lage_festlegen";
}
Wenn ich das Projekt im Harmattan(Emulator) ausführe und den Emulator im Landscape_modus starte öffnet sich die gewünschte Ansicht, beim starten im Portrait_modus funktioniert auch alles wie gewünscht.
Nun kommt der Punkt wo es bei mir hängt.

Wie bekomme ich, wenn das Handy gedreht wird , die Ansicht gedreht entsprechend des Sensorwertes?

Kann mir einer von euch einen Weg aufzeigen, wie man in dem Fall vorgehen muss.

Anbei hab ich das vollständige(Harmattan)Projekt gehängt.

Gruß Califax