Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
d
Dec. 26, 2018, 7:18 p.m.

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

c++, qt, rectangle, mouse

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

Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
6
  • Dec. 26, 2018, 8:59 p.m.
  • (edited)

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

1

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

#include "moveitem.h"
#include <qmath.h>

MoveItem::MoveItem(QObject *parent) :
    QObject(parent), QGraphicsItem(){
    pen.setColor(Qt::blue);
    pen.setWidth(2);
    pen.setCosmetic(true);
    X1=0;
    Y1=0;
    X2=100;
    Y2=100;
}

MoveItem::~MoveItem(){

}

QRectF MoveItem::boundingRect() const{
    return QRectF (X1,Y1,X2,Y2);
}

void MoveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    painter->setPen(pen);
    painter->drawRect(X1,Y1,X2,Y2);
    emit posChanged(this->pos());
    Q_UNUSED(option);
    Q_UNUSED(widget);
}

void MoveItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
    /* Устанавливаем позицию графического элемента
     * в графической сцене, транслировав координаты
     * курсора внутри графического элемента
     * в координатную систему графической сцены
     * */
    this->setPos(mapToScene(event->pos() + m_shiftMouseCoords));
}

void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){
    /* При нажатии мышью на графический элемент
     * заменяем курсор на руку, которая держит этот элемента
     * */
    m_shiftMouseCoords = this->pos() - mapToScene(event->pos());
    this->setCursor(QCursor(Qt::ClosedHandCursor));
    Q_UNUSED(event);
}

void MoveItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
    /* При отпускании мышью элемента
     * заменяем на обычный курсор стрелку
     * */
    QPointF point = this->pos();
    this->setCursor(QCursor(Qt::ArrowCursor));
    Q_UNUSED(event);
}

void MoveItem::setSize(int a, int b){
    prepareGeometryChange();
    X2 = a;
    Y2 = b;
}

void MoveItem::changeSize(){
    prepareGeometryChange();
    X2 += 10;
    Y2 += 10;
}

#ifndef MOVEITEM_H
#define MOVEITEM_H

#include <QObject>
#include <QGraphicsItem>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include <QDebug>
#include <QCursor>
#include <QApplication>

class MoveItem : public QObject, public QGraphicsItem
{
    Q_OBJECT
public:
    explicit MoveItem(QObject *parent = 0);
    ~MoveItem();
    void setSize(int, int);
    void getSize();

signals:
    void posChanged(QPointF point);
private:
    QRectF boundingRect() const;
    QPen pen;
    QPointF m_shiftMouseCoords;

    int X1, Y1, X2, Y2;
    void rounded();
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

public slots:
    void changeSize();
};

#endif // MOVEITEM_H
1
d

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

0
d

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

0

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

untitled_u8d0hJn.7z

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  Scene = new QGraphicsScene(this);
  ui->graphicsView->setBackgroundBrush(QBrush(Qt::darkGray, Qt::SolidPattern));
  ui->graphicsView->setScene(Scene);
  Rect = new MoveItem(0);
  Rect->setPos(50,50);
  Scene->addItem(Rect);
  ui->graphicsView->setAlignment(Qt::AlignCenter);
  ui->graphicsView->installEventFilter(this);
}

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

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

0

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

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
March 19, 2019, 12:57 p.m.
AlexanderBardin

Добрый день. А проверить работоспособность локально как-то можно не указывая реальнй сайт (еще в разработке)
March 16, 2019, 1:55 p.m.
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
March 12, 2019, 10:19 a.m.
Jean Stefanovich

Большое спасибо за разъяснения!
March 12, 2019, 10:04 a.m.
Евгений Легоцкой

Hello, In fact, this functionality or is not implemented, or is not documented. I'm not sure. But I think, that it should be implemented in Text QML Type. Because of we can write text in...
March 12, 2019, 9:51 a.m.
Евгений Легоцкой

Да вы правы. На самом деле проще через QSqlQueryModel, сколько не пытался использовать эти дженерики типо QSqlTableModel и QSqlRelationalTableModel, то всегда упирался в какие-то их ограничени...
Now discuss on the forum
March 19, 2019, 1:43 p.m.
AlexanderBardin

Очень интересная тема. У вас случайно нет статьи с полным циклом интреграции нескольких языков?Так сказать с нуля, что нужно, какие пакеты ставить, что куда писать. Тут вроде информации не ма...
March 17, 2019, 10:47 p.m.
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
March 15, 2019, 9:52 p.m.
Чарльз Грин

спасибо, попробую, отпишусь
m
March 15, 2019, 7:41 p.m.
mihamuz

Сори догадался)
n
March 12, 2019, 4:57 p.m.
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
Join us in social networks

For registered users on the site there is a minimum amount of advertising