N9-00 Landscape drehen Portrait ohne QML

Alles rund um die Programmierung mit Qt
Antworten
Califax
Beiträge: 17
Registriert: 19. Juli 2012 09:05

N9-00 Landscape drehen Portrait ohne QML

Beitrag 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
Dateianhänge
rot_8_5.zip
Achtung: bitte in handy_lage.cpp Zeile: 55

default: orientationSensor_wert = 0;//output = "Invalid enum value";

so wie dargestellt auskommentieren oder löschen!
(6.94 KiB) 183-mal heruntergeladen
Antworten