N9-00 Landscape drehen Portrait ohne QML
Verfasst: 1. April 2013 19:44
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
2.Dann die Ansicht N9-00 (Harmattan Speziefisch) drehen.
Datei: ansichtdrehen.cpp
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
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;
}
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";
}
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