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