QT鼠标的支持(基本概念)与截图

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;
};

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙叙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值