Bewegliche QWidget's in einer QGraphicsScene

Alles rund um die Programmierung mit Qt
Antworten
R.B.
Beiträge: 4
Registriert: 20. September 2012 10:44

Bewegliche QWidget's in einer QGraphicsScene

Beitrag von R.B. »

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:

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;
};
Antworten