d
14 ноября 2018 г. 21:00

Изменение размеров мышкой элемента QGraphicsView

C++, QT

Здравствуйте. уважаемые пользователи форума. Необходимо сделать так, чтобы пользователь мог мышкой изменять размеры формы элемента QGraphicsView.

Вот что-то подобное хотелось чтобы было на QGraphicsView

Поискав, нашел несколько вариантов решения проблемы: с помощью QSplitter , с помощью QSizeGrip , с помощью QDockWidget . Но примеров реализации нигде не нашел. Прошу у вас помощи.







2

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

5
Evgenii Legotckoi
  • 15 ноября 2018 г. 1:56

Добрый день!

QGripSize целится на окно, но никак не на виджет. Здесь можно кастомную вьюшку написать.

Вот в этой статье есть пример написания собственного ресайза .

Но на всякий случай вот пример ресайза за правый нижний угол QGraphicsView, здесь наследоваться пришлось.

CustomGraphicsView.h

  1. #ifndef CUSTOMGRAPHICSVIEW_H
  2. #define CUSTOMGRAPHICSVIEW_H
  3.  
  4. #include <QGraphicsView>
  5.  
  6. class CustomGraphicsView : public QGraphicsView
  7. {
  8. Q_OBJECT
  9. public:
  10. explicit CustomGraphicsView(QWidget *parent = nullptr);
  11.  
  12. QPointF previousPosition() const;
  13. void setPreviousPosition(const QPointF &previousPosition);
  14.  
  15. signals:
  16.  
  17. public slots:
  18.  
  19. protected:
  20. virtual void mousePressEvent(QMouseEvent *event) override;
  21. virtual void mouseReleaseEvent(QMouseEvent *event) override;
  22. virtual void mouseMoveEvent(QMouseEvent *event) override;
  23.  
  24. private:
  25. bool m_leftMouseButtonPressed {false};
  26. QPointF m_previousPosition;
  27. };
  28.  
  29. #endif // CUSTOMGRAPHICSVIEW_H

CustomGraphicsView.cpp

  1. #include "CustomGraphicsView.h"
  2.  
  3. #include <QMouseEvent>
  4. #include <QDebug>
  5.  
  6. CustomGraphicsView::CustomGraphicsView(QWidget *parent) : QGraphicsView(parent)
  7. {
  8. setMouseTracking(true);
  9. }
  10.  
  11. void CustomGraphicsView::mousePressEvent(QMouseEvent *event)
  12. {
  13. if (event->button() == Qt::LeftButton)
  14. {
  15. QPointF position = mapFromGlobal(event->screenPos().toPoint());
  16. qreal x = this->x();
  17. qreal y = this->y();
  18. qreal width = this->width();
  19. qreal height = this->height();
  20.  
  21. QRectF rectRightBottom(x + width - 10, y + height - 10, 10, 10);
  22.  
  23. if (rectRightBottom.contains(position))
  24. {
  25. m_leftMouseButtonPressed = true;
  26. setPreviousPosition(event->pos());
  27. }
  28. }
  29. QGraphicsView::mouseReleaseEvent(event);
  30. }
  31.  
  32. void CustomGraphicsView::mouseReleaseEvent(QMouseEvent *event)
  33. {
  34. if (event->button() == Qt::LeftButton)
  35. {
  36. m_leftMouseButtonPressed = false;
  37. }
  38. QWidget::mouseReleaseEvent(event);
  39. }
  40.  
  41. void CustomGraphicsView::mouseMoveEvent(QMouseEvent *event)
  42. {
  43. if (m_leftMouseButtonPressed)
  44. {
  45. int dy = event->y() - m_previousPosition.y();
  46. int dx = event->x() - m_previousPosition.x();
  47. setGeometry(this->x(), this->y(), this->width() + dx, this->height() + dy);
  48. setPreviousPosition(event->pos());
  49. }
  50. }
  51.  
  52. QPointF CustomGraphicsView::previousPosition() const
  53. {
  54. return m_previousPosition;
  55. }
  56.  
  57. void CustomGraphicsView::setPreviousPosition(const QPointF &previousPosition)
  58. {
  59. m_previousPosition = previousPosition;
  60. }

И установка вьюшки в виджет

  1. #include "Widget.h"
  2. #include "ui_Widget.h"
  3.  
  4. #include "CustomGraphicsView.h"
  5.  
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. CustomGraphicsView* graphicsView = new CustomGraphicsView(this);
  12. }
  13.  
  14. Widget::~Widget()
  15. {
  16. delete ui; 
  17. }

Единственное, здесь абсолютное позиционирование. Я не проверял поведение в лейаутах. Возможно, придётся ещё и устаноку минимальных и максимальных ширины и высоты добавлять.

    d
    • 21 ноября 2018 г. 4:56

    Здравствуйте. сколько не тестировал, но почему то не отлавливается сигнал зажатия левой кнопки мыши. Просто пропускается.

      Evgenii Legotckoi
      • 21 ноября 2018 г. 14:06

      Правый нижний угол у CustomGraphicsView за него дёргать нужно. Добавьте в методы работы с мышью qDebug() и посмотрите его вывод. Прям так, чтобы совсем ничего не было не может быть.

        d
        • 21 ноября 2018 г. 20:37

        Вы правы, просто немного увеличил область. Могу же я добавить ко всем границам такую вещь?

          Evgenii Legotckoi
          • 22 ноября 2018 г. 13:36

          Да, можно, нужно будет только отслеживать, в какой именно области был сделан клик. В первом сообщении я дал ссылку на статью, где это реализовано. А код в том сообщении это урезаный вариант из статьи для правого нижнего угла.

            Комментарии

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