d
27 декабря 2018 г. 1:18

Rectangle, растягиваемый мышкой

c++, qt, rectangle, mouse

У меня есть прямоугольная область, которую мне нужно уметь изменять мышкой. Пока это костыльно написано при помощи 4 линий. Есть ли какой нибудь класс или способ, более гибкий для данной задачи?

2

Вам это нравится? Поделитесь в социальных сетях!

6
Docent
  • 27 декабря 2018 г. 2:59
  • (ред.)

Создаем сцену (QGraphicsScene), на неё кидаем элемент.
В классе элемента отлавливаем mousePressEvent, mouseMoveEvent, mouseReleaseEvent...
Меняем размеры и/или положение элемента.
Элемент например QPainter, метод drawRect.
Размеры меняем если нажатие было на границе элемента, положение если внутри элемента.
Попутно меняем вид курсора на "руку" /"растягивание" при нажатии внутри/на границе.

    Docent
    • 27 декабря 2018 г. 3:17

    Прошу сильно не пинать, примерная реализация класса объекта
    который я кидал на графическую сцену. В данном примере только перемещение, изменение размеров внешнее, недолго будет переделать (и облагородить) на изменение размеров по растягиванию

    1. #include "moveitem.h"
    2. #include <qmath.h>
    3.  
    4. MoveItem::MoveItem(QObject *parent) :
    5. QObject(parent), QGraphicsItem(){
    6. pen.setColor(Qt::blue);
    7. pen.setWidth(2);
    8. pen.setCosmetic(true);
    9. X1=0;
    10. Y1=0;
    11. X2=100;
    12. Y2=100;
    13. }
    14.  
    15. MoveItem::~MoveItem(){
    16.  
    17. }
    18.  
    19. QRectF MoveItem::boundingRect() const{
    20. return QRectF (X1,Y1,X2,Y2);
    21. }
    22.  
    23. void MoveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    24. painter->setPen(pen);
    25. painter->drawRect(X1,Y1,X2,Y2);
    26. emit posChanged(this->pos());
    27. Q_UNUSED(option);
    28. Q_UNUSED(widget);
    29. }
    30.  
    31. void MoveItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
    32. /* Устанавливаем позицию графического элемента
    33. * в графической сцене, транслировав координаты
    34. * курсора внутри графического элемента
    35. * в координатную систему графической сцены
    36. * */
    37. this->setPos(mapToScene(event->pos() + m_shiftMouseCoords));
    38. }
    39.  
    40. void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){
    41. /* При нажатии мышью на графический элемент
    42. * заменяем курсор на руку, которая держит этот элемента
    43. * */
    44. m_shiftMouseCoords = this->pos() - mapToScene(event->pos());
    45. this->setCursor(QCursor(Qt::ClosedHandCursor));
    46. Q_UNUSED(event);
    47. }
    48.  
    49. void MoveItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
    50. /* При отпускании мышью элемента
    51. * заменяем на обычный курсор стрелку
    52. * */
    53. QPointF point = this->pos();
    54. this->setCursor(QCursor(Qt::ArrowCursor));
    55. Q_UNUSED(event);
    56. }
    57.  
    58. void MoveItem::setSize(int a, int b){
    59. prepareGeometryChange();
    60. X2 = a;
    61. Y2 = b;
    62. }
    63.  
    64. void MoveItem::changeSize(){
    65. prepareGeometryChange();
    66. X2 += 10;
    67. Y2 += 10;
    68. }
    69.  
    1. #ifndef MOVEITEM_H
    2. #define MOVEITEM_H
    3.  
    4. #include <QObject>
    5. #include <QGraphicsItem>
    6. #include <QPainter>
    7. #include <QGraphicsSceneMouseEvent>
    8. #include <QDebug>
    9. #include <QCursor>
    10. #include <QApplication>
    11.  
    12. class MoveItem : public QObject, public QGraphicsItem
    13. {
    14. Q_OBJECT
    15. public:
    16. explicit MoveItem(QObject *parent = 0);
    17. ~MoveItem();
    18. void setSize(int, int);
    19. void getSize();
    20.  
    21. signals:
    22. void posChanged(QPointF point);
    23. private:
    24. QRectF boundingRect() const;
    25. QPen pen;
    26. QPointF m_shiftMouseCoords;
    27.  
    28. int X1, Y1, X2, Y2;
    29. void rounded();
    30. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    31. void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    32. void mousePressEvent(QGraphicsSceneMouseEvent *event);
    33. void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    34.  
    35. public slots:
    36. void changeSize();
    37. };
    38.  
    39. #endif // MOVEITEM_H
      d
      • 27 декабря 2018 г. 4:57

      Не работает перемещение. Но дело и в перемещении. Небходимо растягивать границы.

        d
        • 27 декабря 2018 г. 5:20

        А конкретно не работает MouseMove

          Docent
          • 28 декабря 2018 г. 0:03

          Только что создал проект, перемещение работает. Изменение размера как сделать я описал в первой записи.
          Там совсем несложно будет добавить пару записей в обработчики событий мыши.

          untitled_u8d0hJn.7z untitled_u8d0hJn.7z

          1. #include "mainwindow.h"
          2. #include "ui_mainwindow.h"
          3.  
          4. MainWindow::MainWindow(QWidget *parent) :
          5. QMainWindow(parent),
          6. ui(new Ui::MainWindow)
          7. {
          8. ui->setupUi(this);
          9. Scene = new QGraphicsScene(this);
          10. ui->graphicsView->setBackgroundBrush(QBrush(Qt::darkGray, Qt::SolidPattern));
          11. ui->graphicsView->setScene(Scene);
          12. Rect = new MoveItem(0);
          13. Rect->setPos(50,50);
          14. Scene->addItem(Rect);
          15. ui->graphicsView->setAlignment(Qt::AlignCenter);
          16. ui->graphicsView->installEventFilter(this);
          17. }
          18.  
          19. MainWindow::~MainWindow()
          20. {
          21. delete ui;
          22. }

          Вот собственно MainWindow, класс MoveItem, тот что выше без изменений.
          Архив проекта скинул

            Docent
            • 28 декабря 2018 г. 3:38

            Забыл указать:
            Основано на
            автор исходного материала

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь