Überlappen eines GLWidgets (evtl. mit QML-UI)

Alles rund um die Programmierung mit Qt
Antworten
FranzB
Beiträge: 4
Registriert: 2. August 2011 10:17

Überlappen eines GLWidgets (evtl. mit QML-UI)

Beitrag von FranzB »

Hallo,

Ich versuche derzeit eine UI zu erstellen, bei der sich in der Mitte ein GLWidget befindet und außen verschiedene Controls und Anzeigen. Dabei soll sich das GLWidget ins bestehende (QML-)UI einpassen und teilweise überdeckt werden. Zur Verdeutlichung hier ein Bild:
Bild

Die weiße Leiste links soll das GLWidget überdecken. Wie kann man das machen? (mit QML oder auch Qt C++)

Mein bisheriger Code diesbezüglich:

Code: Alles auswählen


	// need a declarative view to display QML UI
	QDeclarativeView* view = new QDeclarativeView(this);
	view->setSource(QUrl::fromLocalFile("Z:/eigenes/ui/test.qml"));
	view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
		
	view->setGeometry(100,100,800,600);
	//view.show();
	setCentralWidget(view);

	glWidget = new GLWidget;

        QHBoxLayout *mainLayout = new QHBoxLayout;
	mainLayout->setContentsMargins(220, 80, 170, 0);
        mainLayout->addWidget(glWidget);
        centralWidget()->setLayout(mainLayout);
Ich habe das GLWidget im Moment über setContentsMargins positioniert. Ich schätze, da muss es eine schönere Möglichkeit geben, die auch die gewünschten Überlappungen zulässt. Weiß da jemand was?

lg
Franz
FranzB
Beiträge: 4
Registriert: 2. August 2011 10:17

Re: Überlappen eines GLWidgets (evtl. mit QML-UI)

Beitrag von FranzB »

So, dann antworte ich halt selber. Generell:

1. MainWindow entfernen, voll auf QDeclarativeView bauen.
2. Eigenes QML-Item in C++ erstellen.
3. GL-Widget-Code in dessen paint()-Methode einfügen.
4. QML-Item in QML bekannt machen und dort nutzen.

Der Code...

Header:

Code: Alles auswählen

#ifndef QWIDGETS_HPP
#define QWIDGETS_HPP
  
#include <QDeclarativeItem>
#include <QGLWidget>
  
class MDE : public QDeclarativeItem
{
 Q_OBJECT
  
public:
 MDE(QDeclarativeItem *parent = 0);
 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
};
  
#endif // QWIDGETS_HPP
Source:

Code: Alles auswählen

#include "GLItem.h"
#include <QApplication>
#include <QDeclarativeView>
 
MDE::MDE(QDeclarativeItem *parent )
{
 setFlag(QGraphicsItem::ItemHasNoContents, false);
}
  
void MDE::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->beginNativePainting();
    glBegin(GL_QUADS);
    glColor3ub(0,0,255);
    glVertex2d(boundingRect().left(), boundingRect().top());
    glVertex2d(boundingRect().right(), boundingRect().top());
    glColor3ub(255,0,0);
    glVertex2d(boundingRect().right(), boundingRect().bottom());
    glVertex2d(boundingRect().left(), boundingRect().bottom());
    glEnd();
    painter->endNativePainting();
}
  
 
int main(int argc, char *argv[])
{
 QApplication app(argc, argv);
  
 qmlRegisterType<MDE>("MDEPlugins", 1, 0, "MDE");
  
 QDeclarativeView view;
 QGLWidget *glWidget = new QGLWidget;
 view.setViewport(glWidget);
 view.setSource(QUrl::fromLocalFile("my.qml"));
 view.show();
 return app.exec();
}
QML:

Code: Alles auswählen

import QtQuick 1.0
import MDEPlugins 1.0
 
Item { width: 400; height: 300
  
 MDE { width: 300; height: 200
  
 }
  
 Rectangle { width: 200; height: 100
  anchors.right:parent.right
  color: "blue"
 }
  
}
Vielleicht hilft's ja jemandem.
Antworten