Difference between revisions of "Qt/Utilities/HandleItem"
From ProgrammingExamples
< Qt
Daviddoria (Talk | contribs) (Created page with '==HandleItem.cpp== <source lang="cpp"> #include <QApplication> #include "form.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Form form; form.show();…') |
(No difference)
|
Revision as of 17:00, 18 November 2011
Contents
HandleItem.cpp
#include <QApplication> #include "form.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Form form; form.show(); return app.exec(); }
form.h
#ifndef FORM_H #define FORM_H #include "ui_form.h" class Form : public QWidget, private Ui::Form { Q_OBJECT public slots: public: Form(QWidget *parent = 0); }; #endif
form.cpp
#include <QtGui> #include "form.h" #include "HandleItem.h" #include <iostream> Form::Form(QWidget *parent) : QWidget(parent) { setupUi(this); QGraphicsScene* scene = new QGraphicsScene( 0, 0, 200, 200 ); QGraphicsRectItem *rectItem = new QGraphicsRectItem( QRect( 10, 10, 50, 100 ), 0, scene ); HandleItem *rrh = new HandleItem( rectItem, scene, Qt::red, HandleItem::RightHandle ); this->graphicsView->setScene( scene ); }
HandleItem.h
#ifndef HANDLEITEM_H #define HANDLEITEM_H #include <QGraphicsItem> #include <QGraphicsRectItem> class HandleItem; class HandleItem : public QGraphicsItem { public: enum HandleRole { CenterHandle, RightHandle, TopHandle, LeftHandle, BottomHandle }; HandleItem( QGraphicsRectItem *item, QGraphicsScene *scene, QColor color, HandleRole role = CenterHandle, QList<HandleItem*> handles = QList<HandleItem*>() ); void paint( QPainter *paint, const QStyleOptionGraphicsItem *option, QWidget *widget ); QRectF boundingRect() const; protected: void mousePressEvent( QGraphicsSceneMouseEvent *event ); void mouseReleaseEvent( QGraphicsSceneMouseEvent *event ); QVariant itemChange( GraphicsItemChange change, const QVariant &data ); private: QGraphicsRectItem *m_item; HandleRole m_role; QColor m_color; QList<HandleItem*> m_handles; bool m_pressed; }; #endif // HANDLEITEM_H
HandleItem.cpp
#include "HandleItem.h" #include <QPainter> #include <QPointF> #include <iostream> HandleItem::HandleItem( QGraphicsRectItem *item, QGraphicsScene *scene, QColor color, HandleItem::HandleRole role, QList<HandleItem*> handles ) : QGraphicsItem( 0, scene ) { m_role = role; m_color = color; m_item = item; m_handles = handles; m_pressed = false; setZValue( 100 ); setFlag( ItemIsMovable ); setFlag(ItemSendsGeometryChanges); } void HandleItem::paint( QPainter *paint, const QStyleOptionGraphicsItem *option, QWidget *widget ) { paint->setPen( m_color ); paint->setBrush( m_color ); QRectF rect = boundingRect(); QVector<QPointF> points; switch( m_role ) { case RightHandle: points << rect.center()+QPointF(3,0) << rect.center()+QPointF(-3,-5) << rect.center()+QPointF(-3,5); paint->drawConvexPolygon( QPolygonF(points) ); break; } } QRectF HandleItem::boundingRect() const { QPointF point = m_item->boundingRect().center(); switch( m_role ) { case RightHandle: point.setX( m_item->boundingRect().right() ); return QRectF( point-QPointF(3, 5), QSize( 6, 10 ) ); } return QRectF(); } QVariant HandleItem::itemChange( GraphicsItemChange change, const QVariant &data ) { if( change == ItemPositionChange && m_pressed ) { QPointF movement; QPointF newData = data.toPointF(); QRectF newRect = m_item->rect(); switch( m_role ) { case RightHandle: std::cout << "itemChange RightHandle()" << std::endl; // Prevent the rectangle from collapsing. if( m_item->sceneBoundingRect().width() + movement.x() <= 5 ) { std::cout << "too small! " << std::endl; return QGraphicsItem::itemChange( change, newData ); } // Snap the movement to the X direction newData.setY(0); movement = newData - pos(); std::cout << "current pos: " << pos().x() << " , " << pos().y() << std::endl; std::cout << "input data: " << data.toPoint().x() << " , " << data.toPoint().y() << std::endl; std::cout << "new data: " << newData.toPoint().x() << " , " << newData.toPoint().y() << std::endl; std::cout << "movement: " << movement.x() << " , " << movement.y() << std::endl; // Resize the rectangle std::cout << "Old right rect pos: " << m_item->rect().right() << std::endl; newRect.setRight(m_item->rect().right() + movement.x()); std::cout << "Set new right rect pos: " << newRect.right() << std::endl; m_item->setRect(newRect); break; } // end switch return QGraphicsItem::itemChange( change, newData); } // end if pressed return QGraphicsItem::itemChange( change, data ); } void HandleItem::mousePressEvent( QGraphicsSceneMouseEvent *event ) { m_pressed = true; QGraphicsItem::mousePressEvent( event ); } void HandleItem::mouseReleaseEvent( QGraphicsSceneMouseEvent *event ) { m_pressed = false; QGraphicsItem::mouseReleaseEvent( event ); }
form.ui
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Form</class> <widget class="QWidget" name="Form"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <widget class="QGraphicsView" name="graphicsView"> <property name="geometry"> <rect> <x>80</x> <y>50</y> <width>256</width> <height>192</height> </rect> </property> </widget> </widget> <resources/> <connections/> </ui>
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) PROJECT(HandleItem) FIND_PACKAGE(Qt4 REQUIRED) INCLUDE(${QT_USE_FILE}) QT4_WRAP_UI(UISrcs form.ui) QT4_WRAP_CPP(MOCSrcs form.h) include_directories(${include_directories} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) ADD_EXECUTABLE(HandleItem main.cpp HandleItem.cpp form.cpp ${MOCSrcs} ${UISrcs}) TARGET_LINK_LIBRARIES(HandleItem ${QT_LIBRARIES})