QtOpenGL und GridLayout

Alles rund um die Programmierung mit Qt
Antworten
QtNewbie
Beiträge: 11
Registriert: 2. November 2009 11:10

QtOpenGL und GridLayout

Beitrag von QtNewbie »

hi
ich bin neu in der qt programmierung meine aber mich schon ein wenig in c++ auszukennen. ich habe jetzt folgende schwierigkeit. mit dem folgendem code stelle ich einen 3D Würfel da. der ganze OpenGL kram tut für das Problem nichts zur sache. ich lasse das glwidget in einem gridlayout anzeigen. nun benötige ich die mauskoordinaten aus dem gridlayout. im moment ist es so, dass ich mir die mauskoords in zwei line edits anzeigen lasse. fahre ich jetzt mit der maus über meine GUI ändert sich auch schön der wert. fahre ich über mein gridlayout mit dem würfel, bleibt das mousetracking stehen und die line edits zeigen nichts mehr an. mein ziel ist es dass ich wenn ich über die GUI fahre keine Koords angezeigt werden, aber sobald ich ins gridlayout komme die koords desselben ausgegeben werden. und zwar skaliert von 0 bis max breite des gridlayouts und von 0 bis max höhe des gridlayouts. das ist auch ein bisschen blöd das ich das nicht so nach maßen ziehen kann sondern das im qt designer nur pi mal daumen ziehen kann. eine skalierung im designer wie bei nem label hab ich jedenfalls noch nicht gefunden.
es wäre total nett wenn ihr ein paar ideen hättet. danke sehr schonmal hier ist der code.
anbei das m_glwidget ist ein objekt der klasse glwidget und ermöglicht mir den zugriff auf die 3d vertices des würfels und den ganzen anderen openGL kram aber das tut hier nichts zur sache. das problem kann man ja auch erzeugen in dem man eine neue qapplication erzeugt. und im designer ein gridlayout in die GUI zieht, sowie zwei line edits und die mousemoveevent funktion einbaut, die dann im line edit ausgegeben wird. danke nochmal
lg
der qtnewbie


Header:

Code: Alles auswählen

#ifndef CUBE_H
#define CUBE_H

#include <QtGui/QWidget>
#include "glwidget.h"
#include "ui_cube.h"

class GLWidget;
class Cube : public QWidget
{
	Q_OBJECT

public:
	Cube(QWidget *parent = 0, Qt::WFlags flags = 0);
	~Cube();

	void mouseMoveEvent(QMouseEvent *event);
	int m_iposX;
	int m_iposY;

private:
	Ui::CubeClass ui;
	GLWidget* m_glwidget;
};

#endif // CUBE_H
cpp

Code: Alles auswählen

#include "cube.h"
#include <QMouseEvent>

Cube::Cube(QWidget *parent, Qt::WFlags flags)
	: QWidget(parent, flags)
{
	setMouseTracking(true);
	ui.setupUi(this);
	m_glwidget = new GLWidget(0, 0);
	ui.gridLayout->addWidget(m_glwidget, 0, 0);
	m_iposX = 0;
	m_iposY = 0;
}

Cube::~Cube()
{

}

void Cube::mouseMoveEvent(QMouseEvent *event)
{
	m_iposX = event->x();
	m_iposY = event->y();
	ui.lineEdit_MouseX->setText(QString::number(m_iposX));
	ui.lineEdit_MouseY->setText(QString::number(m_iposY));
}
N&#164;X
Beiträge: 77
Registriert: 21. September 2009 12:24

Beitrag von N&#164;X »

Also ich nehme mal an das Problem liegt darin, dass du die MouseMove-Events des QWidgets behandelst. Dadurch bekommst du nur MouseMove-Events solange deine Maus über dem Widget ist, da wo es vom GLWidget verdeckt wird allerdings nicht (da bekommt das GLWidget die nämlich).
Was du willst ist wohl die mouseMoveEvent(...) vom QGLWidget überladen, dann kriegst du wenn du mit der Maus über das GLWidget fährst die Koordinaten relativ zum GLWidget. Dafür musst du also dein GLWidget überladen.
Du solltest eigentlich sowieso deine eigene Klasse von QGLWidget ableiten, damit du paintGL() und so überladen kannst, und bei der Gelegenheit kannst du dann auch die mouseMoveEvent entsprechend überladen. Doku.
Antworten