d
Dec. 27, 2018, 1:18 a.m.

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

c++, qt, rectangle, mouse

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

2

Do you like it? Share on social networks!

6
Docent
  • Dec. 27, 2018, 2:59 a.m.
  • (edited)

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

    Docent
    • Dec. 27, 2018, 3:17 a.m.

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

    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
      • Dec. 27, 2018, 4:57 a.m.

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

        d
        • Dec. 27, 2018, 5:20 a.m.

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

          Docent
          • Dec. 28, 2018, 12:03 a.m.

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

          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
            • Dec. 28, 2018, 3:38 a.m.

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

              Comments

              Only authorized users can post comments.
              Please, Log in or Sign up
              • Last comments
              • AK
                April 1, 2025, 11:41 a.m.
                Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
              • Evgenii Legotckoi
                March 9, 2025, 9:02 p.m.
                К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
              • VP
                March 9, 2025, 4:14 p.m.
                Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
              • ИМ
                Nov. 22, 2024, 9:51 p.m.
                Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              • Evgenii Legotckoi
                Oct. 31, 2024, 11:37 p.m.
                Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup