QT鼠标的支持(基本概念)
MyWidget.cpp
#include "MyWidget.h"
MyWidget::MyWidget(QWidget *parent)
: QFrame(parent)
{
m_pressedFlag = false;
}
MyWidget::~MyWidget()
{
}
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
int width = this->width();
int height = this->height();
//背景
painter.setBrush(QColor(0,0,0));
painter.drawRect(0, 0, width, height);
painter.setPen(QColor(0xff, 0, 0));
if (m_pressedFlag)
{
for (int i = 0; i < m_points.size() - 1; i++)
{
QPoint& p1 = m_points[i];
QPoint& p2 = m_points[i + 1];
painter.drawLine(p1, p2);
qDebug("(%d,%d)-(%d,%d)", p1.x(), p1.y(), p2.x(), p2.y());
}
}
}
void MyWidget::mouseDoubleClicked(QMouseEvent* event)
{
QWidget::mouseDoubleClickEvent(event);
}
void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
if (m_pressedFlag)
{
QPoint pos = event->pos();
m_points.append(pos);
qDebug("(%d,%d)", pos.x(),pos.y());
update();//重画
}
}
void MyWidget::mousePressEvent(QMouseEvent* event)
{
m_pressedFlag = true;
}
void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
m_pressedFlag = false;
}
MyWidget.h
#pragma once
#include <QFrame>
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>
#include <QMouseEvent>
#include <QVector>//STL:vector
#include <QPoint>
class MyWidget : public QFrame
{
Q_OBJECT
public:
MyWidget(QWidget *parent);
~MyWidget();
private:
void paintEvent(QPaintEvent* event);
//鼠标支持
void mouseDoubleClicked(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
private:
bool m_pressedFlag;
QVector<QPoint> m_points; //轨迹上的点
};
QT鼠标的支持(发射信号)
为了实现信号和槽这种机制,增加了这个函数emit()
MyWidget.cpp
#include "MyWidget.h"
MyWidget::MyWidget(QWidget *parent)
: QFrame(parent)
{
m_start = m_end = QPoint(0,0);
m_pressedFlag = false;
m_picture.load(":/QtGuiApplication11_6/Resources/landscape.jpg");
}
MyWidget::~MyWidget()
{
}
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
int width = this->width();
int height = this->height();
//不要把加载图片放在这里,不然每次都是现加图片,浪费资源,放在构造函数里加载一次就够了。
//显示背景图片
painter.drawPixmap(0, 0, width, height, m_picture);
//画出区域
if (m_pressedFlag)
{
//十字交叉线
painter.setPen(QColor(0xff, 0, 0));
painter.drawLine(QPoint(0, m_curPos.y()), QPoint(width, m_curPos.y()));
painter.drawLine(QPoint(m_curPos.x(), 0), QPoint(m_curPos.x(), height));
}
//计算选中的区域
QRect selected(m_start, m_end);
if (0)
{
//普通画法
painter.setBrush(QColor(0x80, 0x80, 0x80));
painter.drawRect(selected);
}
else
{
//透明度画法
QRect full(0, 0, width, height);
painter.setBrush(QColor(0, 0, 0,100));
painter.setClipRegion(QRegion(full) - QRegion(selected));
painter.drawRect(full);
}
背景
//painter.setBrush(QColor(0,0,0));
//painter.drawRect(0, 0, width, height);
//painter.setPen(QColor(0xff, 0, 0));
//if (m_pressedFlag)
//{
// for (int i = 0; i < m_points.size() - 1; i++)
// {
// QPoint& p1 = m_points[i];
// QPoint& p2 = m_points[i + 1];
// painter.drawLine(p1, p2);
// qDebug("(%d,%d)-(%d,%d)", p1.x(), p1.y(), p2.x(), p2.y());
// }
//}
}
void MyWidget::mouseDoubleClicked(QMouseEvent* event)
{
QWidget::mouseDoubleClickEvent(event);
}
void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
if (m_pressedFlag)
{
//QPoint pos = event->pos();
//m_points.append(pos);
//qDebug("(%d,%d)", pos.x(),pos.y());
m_end = event->pos();
m_curPos = event->pos();
update();//重画
}
}
void MyWidget::mousePressEvent(QMouseEvent* event)
{
m_pressedFlag = true;
m_start = m_end = event->pos();//记录起始的点
}
void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
m_pressedFlag = false;
//update();
//用户结束选区时发射事件
QRect area(m_start, m_end);
emit selected(area);
}
MyWidget.h
#pragma once
#include <QFrame>
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>
#include <QMouseEvent>
#include <QVector>//STL:vector
#include <QPoint>
#include <QPixmap>
class MyWidget : public QFrame
{
Q_OBJECT
//声明信号
signals:
void selected(QRect area);
public:
MyWidget(QWidget *parent);
~MyWidget();
private:
void paintEvent(QPaintEvent* event);
//鼠标支持
void mouseDoubleClicked(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
private:
bool m_pressedFlag;
QVector<QPoint> m_points; //轨迹上的点
QPixmap m_picture;
QPoint m_curPos;
QPoint m_start, m_end;
};
效果: