Рисуем линию QGraphicsItem за мышью
Здравствуйте. Два дня пытался сделать отрисовку линии объявленной как QGraphicsItem в сцене. Хочу чтобы при зажатой кнопке прямая линия отрисовывалась за мышью. Но что-то не выходит. Прочитал данный топик https://evileg.com/forum/topic/218/ , но он как раз про простой способ рисования, когда методы мыши реализованы в сцене(это получилось). Но когда я хочу чтобы сам Item отвечал за отрисовку, выходит нечто странное. Вообщем зашел в тупик и не знаю что делать. Вот мой исходный код:
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "myscene.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); MyScene *pScene = new MyScene(this); ui->centralWidget->setScene(pScene); connect(ui->actionRect, SIGNAL(triggered(bool)), ui->centralWidget->scene(), SLOT(mySlotLine())); } MainWindow::~MainWindow() { delete ui; }myscene.h
#ifndef MYSCENE_H #define MYSCENE_H #include<QObject> #include<QGraphicsScene> #include <QGraphicsSceneMouseEvent> #include<QColor> #include<QString> #include"myline.h" class MyScene : public QGraphicsScene { Q_OBJECT public: MyScene(QObject *parent =0); protected: virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent); virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent); private: MyLine *line; bool isDrawLine = false; void addMyLine(QPointF p); public slots: void mySlotLine(); }; #endif // MYSCENE_Hmyscene.cpp
#include "myscene.h" MyScene::MyScene(QObject *parent) : QGraphicsScene(parent) { setSceneRect(0,0,500,500); setFocus(); } void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { if ((mouseEvent->button() == Qt::LeftButton)&&(isDrawLine)) { isDrawLine = false; addMyLine(mouseEvent->scenePos()); } line->mousePressEvent(mouseEvent); } void MyScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { line->mouseMoveEvent(mouseEvent); } void MyScene::mySlotLine() { line = new MyLine(this); isDrawLine = true; } void MyScene::addMyLine(QPointF p) { line->setPoint(p, p); line->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); addItem(line); }myline.h
#ifndef MYLINE_H #define MYLINE_H #include <QObject> #include <QGraphicsItem> #include <QRectF> #include <QGraphicsSceneMouseEvent> #include <QPen> #include <QPainter> class MyLine : public QObject , public QGraphicsItem { Q_OBJECT public: MyLine(QObject *parent = 0); ~MyLine(); void setPoint(QPointF beginP, QPointF endP); virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); protected: virtual QRectF boundingRect() const; virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private: QPointF p1; QPointF p2; }; #endif // MYLINE_Hmyline.cpp
#include "myline.h" MyLine::MyLine(QObject *parent): QObject(parent), QGraphicsItem() { } MyLine::~MyLine() { } void MyLine::setPoint(QPointF beginP, QPointF endP) { p1 = beginP; p2 = endP; } void MyLine::mousePressEvent(QGraphicsSceneMouseEvent *event) { QGraphicsItem::mousePressEvent(event); } void MyLine::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { p2 = event->scenePos(); this->setPoint(p1, p2); QGraphicsItem::mouseMoveEvent(event); } void MyLine::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { QGraphicsItem::mouseReleaseEvent(event); } QRectF MyLine::boundingRect() const { return QRectF(p1,p2).normalized(); } void MyLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { QPen pen; pen.setWidth(5); pen.setBrush(Qt::black); painter->setPen(pen); if (p1 == p2) { painter->drawPoint(p1); } else { painter->drawLine(p1,p2); } }
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD
- Akiv Doros
- 11 ноября 2024 г. 23:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
m
- molni99
- 26 октября 2024 г. 9:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
m
- molni99
- 26 октября 2024 г. 9:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Последние комментарии
Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
Сейчас обсуждают на форуме
добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
IscanderChe31 октября 2024 г. 23:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3 октября 2024 г. 12:05
Добрый день!
Файлы проекта
Я поправил немного Ваш код.
Большое спасибо!