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

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

C++, QT

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

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

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







Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS
5

Добрый день!

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

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

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

CustomGraphicsView.h

#ifndef CUSTOMGRAPHICSVIEW_H
#define CUSTOMGRAPHICSVIEW_H

#include <QGraphicsView>

class CustomGraphicsView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit CustomGraphicsView(QWidget *parent = nullptr);

    QPointF previousPosition() const;
    void setPreviousPosition(const QPointF &previousPosition);

signals:

public slots:

protected:
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void mouseReleaseEvent(QMouseEvent *event) override;
    virtual void mouseMoveEvent(QMouseEvent *event) override;

private:
    bool m_leftMouseButtonPressed {false};
    QPointF m_previousPosition;
};

#endif // CUSTOMGRAPHICSVIEW_H

CustomGraphicsView.cpp

#include "CustomGraphicsView.h"

#include <QMouseEvent>
#include <QDebug>

CustomGraphicsView::CustomGraphicsView(QWidget *parent) : QGraphicsView(parent)
{
    setMouseTracking(true);
}

void CustomGraphicsView::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        QPointF position = mapFromGlobal(event->screenPos().toPoint());
        qreal x = this->x();
        qreal y = this->y();
        qreal width = this->width();
        qreal height = this->height();

        QRectF rectRightBottom(x + width - 10, y + height - 10, 10, 10);

        if (rectRightBottom.contains(position))
        {
            m_leftMouseButtonPressed = true;
            setPreviousPosition(event->pos());
        }
    }
    QGraphicsView::mouseReleaseEvent(event);
}

void CustomGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_leftMouseButtonPressed = false;
    }
    QWidget::mouseReleaseEvent(event);
}

void CustomGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    if (m_leftMouseButtonPressed)
    {
        int dy = event->y() - m_previousPosition.y();
        int dx = event->x() - m_previousPosition.x();
        setGeometry(this->x(), this->y(), this->width() + dx, this->height() + dy);
        setPreviousPosition(event->pos());
    }
}

QPointF CustomGraphicsView::previousPosition() const
{
    return m_previousPosition;
}

void CustomGraphicsView::setPreviousPosition(const QPointF &previousPosition)
{
    m_previousPosition = previousPosition;
}

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

#include "Widget.h"
#include "ui_Widget.h"

#include "CustomGraphicsView.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    CustomGraphicsView* graphicsView = new CustomGraphicsView(this);
}

Widget::~Widget()
{
    delete ui; 
}

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

2
d

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

0

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

1
d

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

0

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
m
19 мая 2019 г. 1:49
mahhaki

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
S
17 мая 2019 г. 13:14
SunBro

Qt - Тест 001. Сигналы и слоты

  • Результат:42баллов,
  • Очки рейтинга-8
b
17 мая 2019 г. 4:18
banana

C++ - Тест 003. Условия и циклы

  • Результат:57баллов,
  • Очки рейтинга-2
Последние комментарии
P.
18 мая 2019 г. 14:03
PELMYACH .

Спасибо большое! Вскоре буду разбираться!
18 мая 2019 г. 9:13
Евгений Легоцкой

Добрый день! Отнимать значение общего счётчика можно в деструкторе класса кнопки QDynamicButton::~QDynamicButton(){ ResID--;} При этом я бы ещё переустанавливал значения вс...
P.
14 мая 2019 г. 22:33
PELMYACH .

Здравствуйте!А не подскажите, как можно при удалении какой либо кнопки, у щётчика отнять значение?Дабы например четвёртой кнопке соответствовал ID 4, а не 5 скажем
6 мая 2019 г. 6:39
Евгений Легоцкой

Добрый день. Этот урок для Qt Quick Control версии 1, Вы используете вторую версию. Здесь style уже нет, кастомизацию можно делать уже или черещ соответствующие property или через ...
U
4 мая 2019 г. 3:14
Unreal_man

Делаю вроде правильно, а ничего не получается. Что упустил? После button1. в выпадающем списке нет style.Да, и откуда в уроке взялся файл .pri и зачем он нужен?
Сейчас обсуждают на форуме
19 мая 2019 г. 12:45
Михаиллл

Скачал openssl-1.1.1 от сюда , но не понимаю что делать с этой папкой
19 мая 2019 г. 10:52
Евгений Легоцкой

Если честно, то мне нужно самому время потратить, чтобы глянуть это дело. Я использовал Flutter для разработки, а не Qt. Просто исходя из опыта, могу сказать, что по большей части всё на эмуля...
16 мая 2019 г. 23:08
BlinCT

Решил через indexOf сделать. Возвращает или номер позиции где нашел символ или строку или -1 если не найдено.
15 мая 2019 г. 15:06
Михаиллл

Спасибо , заработало.Получаю ответный сигнал.Но теоретически, в ответ на запрос должен прийти json файл. Скажите пожалуйста, как можно открыть ответные данные, прочитать их, и потом удалить...
14 мая 2019 г. 11:07
Евгений Легоцкой

Из той задачи, которую вы привели, у вас есть база данных и таблица в ней с текстами. Для представления данных из базы данных обычно используют QTableView, а text browser здесь не к мест...

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB