#include #include #include #include #include #include #include #include #include class QStyleOptionGraphicsItem; class GraphicsRectItem : public QGraphicsRectItem { public: GraphicsRectItem(int x, int y, int w, int h) : QGraphicsRectItem(x, y, w, h, 0) { } virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget* widget); }; void GraphicsRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { if ( isSelected() ) { painter->setBrush(Qt::red); } else { painter->setBrush(Qt::blue); } painter->drawRect(rect()); } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); private slots: void rotate(int value); private: QGraphicsView *m_graphicsView; QGraphicsScene *m_scene; void populateScene(); double m_currentRotation; }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { resize(600, 700); m_graphicsView = new QGraphicsView(); m_graphicsView->setRenderHint(QPainter::HighQualityAntialiasing, true); m_graphicsView->setRenderHint(QPainter::SmoothPixmapTransform, true); m_graphicsView->setDragMode(QGraphicsView::RubberBandDrag); m_graphicsView->setRubberBandSelectionMode(Qt::IntersectsItemShape); //m_graphicsView->setRubberBandSelectionMode(Qt::ContainsItemShape); QSlider *zoomSlider = new QSlider(Qt::Horizontal, this); zoomSlider->setMinimum(-45); zoomSlider->setMaximum(45); zoomSlider->setValue(0); zoomSlider->setTickPosition(QSlider::TicksBelow); zoomSlider->setTickInterval(5); zoomSlider->setPageStep(10); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(m_graphicsView); layout->addWidget(zoomSlider); QWidget *centralWidget = new QWidget; centralWidget->setLayout(layout); setCentralWidget(centralWidget); m_scene = new QGraphicsScene; m_graphicsView->setScene(m_scene); populateScene(); connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(rotate(int))); } void MainWindow::populateScene() { for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j ++) { GraphicsRectItem *rect = new GraphicsRectItem(i*20, j*20, 10, 10); rect->setFlag(QGraphicsItem::ItemIsSelectable, true); m_scene->addItem(rect); } } } void MainWindow::rotate(int value) { if (m_currentRotation != (double)value) { m_graphicsView->rotate(m_currentRotation - (double)value); m_currentRotation = (double)value; } } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } #include "main.moc"