#ifndef OBSERVERWIDGET_H
#define OBSERVERWIDGET_H
#include <QDebug>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
class ObserverWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(int type MEMBER m_Type READ type WRITE setType)
public:
explicit ObserverWidget(QWidget *parent = nullptr);
void setImage(const QImage &image);
int type() const;
public slots:
void setType(int type);
public:
enum Type {
HorizontalLine = 0x01,
VerticalLine = 0x02,
Line = 0x03,
};
enum Status {
START1 = 0x01,
A1 = 0x2,
B1 = 0x3,
END1 = 0x4,
START2 = 0x01 + END1,
A2 = 0x2 + END1,
B2 = 0x3 + END1,
END2 = 0x4 + END1,
};
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
private:
QImage m_Image;
QPoint m_StartPos;
QPoint m_EndPos;
int m_Status;
private:
int m_Type;
};
#endif
#include "observerwidget.h"
ObserverWidget::ObserverWidget(QWidget *parent) : QWidget(parent)
{
m_Type = -1;
m_Status = 0;
}
void ObserverWidget::setImage(const QImage &image)
{
m_Image = image;
}
int ObserverWidget::type() const
{
return m_Type;
}
void ObserverWidget::setType(int type)
{
m_Type = type;
switch (m_Type) {
case ObserverWidget::Line:
m_Status = ObserverWidget::START1;
break;
case ObserverWidget::HorizontalLine:
m_Status = ObserverWidget::START1;
break;
case ObserverWidget::VerticalLine:
m_Status = ObserverWidget::START2;
break;
}
setMouseTracking(true);
}
void ObserverWidget::mouseMoveEvent(QMouseEvent *event)
{
switch (m_Status) {
case ObserverWidget::A1:
case ObserverWidget::B1:
m_StartPos = event->pos();
repaint();
break;
}
}
void ObserverWidget::mousePressEvent(QMouseEvent *event)
{
switch (m_Status) {
case ObserverWidget::START1:
m_StartPos = event->pos();
m_Status = ObserverWidget::A1;
setMouseTracking(true);
repaint();
break;
case ObserverWidget::A1:
m_StartPos = event->pos();
m_Status = ObserverWidget::END1;
setMouseTracking(false);
repaint();
break;
case ObserverWidget::END1:
qDebug() << event->pos() << m_StartPos;
if (event->pos().y() == m_StartPos.y()) {
m_StartPos = event->pos();
m_Status = ObserverWidget::B1;
repaint();
}
break;
default:
break;
}
}
void ObserverWidget::mouseReleaseEvent(QMouseEvent *event)
{
switch (m_Status) {
case ObserverWidget::B1:
m_StartPos = event->pos();
m_Status = ObserverWidget::END1;
repaint();
break;
}
}
void ObserverWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen;
pen.setWidth(5);
pen.setColor(Qt::green);
painter.setPen(pen);
painter.drawImage(rect(), m_Image);
switch (m_Type) {
case ObserverWidget::Line:
painter.drawLine(m_StartPos.x(), m_StartPos.y(), m_EndPos.x(), m_EndPos.y());
break;
case ObserverWidget::HorizontalLine:
painter.drawLine(0, m_StartPos.y(), width(), m_StartPos.y());
break;
case ObserverWidget::VerticalLine:
painter.drawLine(m_StartPos.x(), 0, m_StartPos.x(), height());
break;
}
}