Bewegliche QWidget's in einer QGraphicsScene
Verfasst: 25. April 2013 14:49
Hallo,
ich knobel schon seit Tagen daran, QWidget-Objekte in eine QGraphicsScene einzufügen. Das Problem dabei: Alle QWidgets (Typ QDialog, QDial) erscheinen nach dem Einfügen mit GraphicsScene::addWidget(...) zwar auf der grafischen Oberfläche, sind dort jedoch festgenagelt. D.h., der Benutzer kann die Objekte mit der Maus weder selektieren noch auf andere Positionen verschieben.
Bei Objekten vom Typ QGraphicsItem, die ich mit GraphicsScene::addItem(...) in die Scene einfüge, klappt das, wenn mit folgender Funktion folgende Flags gesetzt werden:
QGraphicsItem::setFlag(QGraphicsItem::ItemIsSelectable);
QGraphicsItem::setFlag(QGraphicsItem::ItemIsMovable);
Die Funktion GraphicsScene::addWidget(...) gibt einen Zeiger vom Typ QGraphicsProxyWidget* zurrück, der für die QWidget's die gleiche Funktion zur Verfügung stellen sollte, da QGraphicsProxyWidget von QGraphicsWidget abgeleitet ist. Die Aufrufe der Funktion
QGraphicsProxyWidget::setFlag(QGraphicsItem::ItemIsSelectable)
QGraphicsProxyWidget::setFlag(QGraphicsItem::ItemIsMovable)
bleiben jedoch wirkungslos. (Qt Version 4.7.4) Tja, was nun? Wie bekommt man QWidget-Objekte grafisch selektierbar und beweglich? Quellcode:
ich knobel schon seit Tagen daran, QWidget-Objekte in eine QGraphicsScene einzufügen. Das Problem dabei: Alle QWidgets (Typ QDialog, QDial) erscheinen nach dem Einfügen mit GraphicsScene::addWidget(...) zwar auf der grafischen Oberfläche, sind dort jedoch festgenagelt. D.h., der Benutzer kann die Objekte mit der Maus weder selektieren noch auf andere Positionen verschieben.
Bei Objekten vom Typ QGraphicsItem, die ich mit GraphicsScene::addItem(...) in die Scene einfüge, klappt das, wenn mit folgender Funktion folgende Flags gesetzt werden:
QGraphicsItem::setFlag(QGraphicsItem::ItemIsSelectable);
QGraphicsItem::setFlag(QGraphicsItem::ItemIsMovable);
Die Funktion GraphicsScene::addWidget(...) gibt einen Zeiger vom Typ QGraphicsProxyWidget* zurrück, der für die QWidget's die gleiche Funktion zur Verfügung stellen sollte, da QGraphicsProxyWidget von QGraphicsWidget abgeleitet ist. Die Aufrufe der Funktion
QGraphicsProxyWidget::setFlag(QGraphicsItem::ItemIsSelectable)
QGraphicsProxyWidget::setFlag(QGraphicsItem::ItemIsMovable)
bleiben jedoch wirkungslos. (Qt Version 4.7.4) Tja, was nun? Wie bekommt man QWidget-Objekte grafisch selektierbar und beweglich? Quellcode:
Code: Alles auswählen
#include <QtGui>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
int main(int argc, char *argv[])
{ QApplication Application(argc, argv);
QGraphicsScene GraphicsScene;
QGraphicsView GraphicsView(&GraphicsScene);
GraphicsView.setFixedSize(256 - (QStyle::PM_DefaultFrameWidth)*0, 256-(QStyle::PM_TitleBarHeight)-(QStyle::PM_DefaultFrameWidth)*1);
GraphicsView.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
GraphicsView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
QGraphicsEllipseItem GraphicsEllipseItem(-32, -32, 64, 64);
GraphicsScene.addItem(&GraphicsEllipseItem);
GraphicsEllipseItem.setFlag(QGraphicsItem::ItemIsSelectable); // Objekt selektierbar
GraphicsEllipseItem.setFlag(QGraphicsItem::ItemIsMovable); // Objekt beweglich
QDial Dial;
QGraphicsProxyWidget* const pDialGraphicsProxyWidget=GraphicsScene.addWidget(&Dial);
pDialGraphicsProxyWidget->setPos(64, 64);
pDialGraphicsProxyWidget->setFlag(QGraphicsItem::ItemIsSelectable); // Bleibt wirkungslos
pDialGraphicsProxyWidget->setFlag(QGraphicsItem::ItemIsMovable); // Bleibt wirklungslos
GraphicsView.show();
const int rc=Application.exec();
return rc;
};