#include <cassert>
#include <cmath>
#include <QApplication>
#include <QDesktopWidget>
#include <QGraphicsProxyWidget>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QLineEdit>
#include <QLabel>
#include <QVBoxLayout>
#include <QDialog>
#include <QGraphicsSceneMouseEvent>
#include <QPointer>
struct MyWidget : public QDialog
{
MyWidget(QWidget *parent = 0, Qt::WindowFlags f = 0)
: QDialog(parent,f),
m_edit(new QLineEdit(this)),
m_label(new QLabel(this))
{
assert(!this->layout());
QVBoxLayout * const layout = new QVBoxLayout(this);
this->setLayout(layout);
layout->addWidget(m_label);
layout->addWidget(m_edit);
}
QLineEdit * const m_edit;
QLabel * const m_label;
};
int main(int argc, char **argv)
{
//Create the application
QApplication app(argc, argv);
//Create the Qt Graphics Framework components
QGraphicsScene scene;
QGraphicsView view(&scene);
view.setGeometry(0,0,600,400);
{
//Put the dialog in the screen center
const QRect screen = QApplication::desktop()->screenGeometry();
view.move( screen.center() - view.rect().center() );
}
view.show();
//Create the QLineEdit instances
const int sz = 10;
std::vector<QGraphicsProxyWidget *> proxies;
for (int i=0; i!=sz; ++i)
{
MyWidget * const mywidget = new MyWidget;
mywidget->setGeometry(0,0,64,22);
mywidget->m_label->setText(QString("#") + QString::number(i));
mywidget->m_edit->setText(QString("Text ") + QString::number(i));
//Add the QWidget and obtain its proxy
QGraphicsProxyWidget * const proxy = scene.addWidget(mywidget,Qt::Window);
proxies.push_back(proxy);
}
const double ray = 150.0; //pixels
for (int i=0; i!=sz; ++i)
{
const double angle = 2.0 * M_PI * static_cast<double>(i) / static_cast<double>(sz);
const int x = static_cast<int>(0.0 + (std::sin(angle) * ray));
const int y = static_cast<int>(0.0 - (std::cos(angle) * ray));
QGraphicsProxyWidget * const proxy = proxies[i];
proxy->setRotation(angle * 360.0 / (2.0 * M_PI));
proxy->setPos(x,y);
//proxy->setFlag(QGraphicsItem::ItemIsMovable,true); //No need to set this flag
}
return app.exec();
}
|