ledok
This commit is contained in:
parent
c311554cee
commit
6015d932d3
|
@ -11,6 +11,8 @@ greaterThan(QT_MAJOR_VERSION, 5) {
|
||||||
CONFIG += c++20
|
CONFIG += c++20
|
||||||
} else {
|
} else {
|
||||||
CONFIG += c++17
|
CONFIG += c++17
|
||||||
|
QMAKE_CFLAGS += /utf-8
|
||||||
|
QMAKE_CXXFLAGS += /utf-8
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG += lrelease
|
CONFIG += lrelease
|
||||||
|
|
|
@ -1,153 +0,0 @@
|
||||||
/**
|
|
||||||
* @author : 陈鲁勇
|
|
||||||
* @date : 2017年04月
|
|
||||||
* @version: 1.0
|
|
||||||
* @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权;
|
|
||||||
* 除非遵守本许可,否则您不能使用这个文件。
|
|
||||||
* @remarks: 您可以获得该许可的副本:
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* 除非适用法律需要或者书面同意,按本许可分发的软件
|
|
||||||
* 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。
|
|
||||||
* 参见按照本许可控制许可权限及限制的特定语言的许可证。
|
|
||||||
*
|
|
||||||
* 你可以获得该代码的最新版本:
|
|
||||||
*
|
|
||||||
* https://git.oschina.net/Mr_ChenLuYong/screenshot
|
|
||||||
*
|
|
||||||
* 开源社区的所有人都期待与你的共同维护。
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习:
|
|
||||||
*
|
|
||||||
* 博客地址:http://blog.csdn.net/csnd_ayo
|
|
||||||
*
|
|
||||||
* 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915
|
|
||||||
*
|
|
||||||
* 期待你提交Bug,欢迎Issues。
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "oeamplifier.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include <QPixmap>
|
|
||||||
#include <QPainter>
|
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
|
||||||
#include <QDebug>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include "oecommonhelper.h"
|
|
||||||
|
|
||||||
OEAmplifier::OEAmplifier(std::shared_ptr<QPixmap> originPainting, QWidget *parent) :
|
|
||||||
QWidget(parent), originPainting_(originPainting) {
|
|
||||||
/// 设置成无边框对话框
|
|
||||||
setWindowFlags(Qt::FramelessWindowHint|Qt::WindowSystemMenuHint);
|
|
||||||
/// 开启鼠标实时追踪
|
|
||||||
setMouseTracking(true);
|
|
||||||
|
|
||||||
/// 设置默认大小
|
|
||||||
sideLength_ = 122 * OECommonHelper::getWindowHeightMultiplyingPower();
|
|
||||||
imageHeight_ = 90 * OECommonHelper::getWindowHeightMultiplyingPower();
|
|
||||||
setFixedSize(sideLength_,sideLength_);
|
|
||||||
|
|
||||||
/// 默认隐藏
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEAmplifier::onSizeChange(int w, int h) {
|
|
||||||
screenSize_ = QSize(w, h);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEAmplifier::onPostionChange(int x, int y) {
|
|
||||||
cursorPoint_ = QPoint(x, y);
|
|
||||||
raise();
|
|
||||||
int dest_x = x + 4;
|
|
||||||
int dest_y = y + 26;
|
|
||||||
|
|
||||||
/// 超出屏幕检测
|
|
||||||
const QSize& parent_size = parentWidget()->size();
|
|
||||||
if (dest_y + height() > parent_size.height()) {
|
|
||||||
dest_y = y - 26 - height();
|
|
||||||
}
|
|
||||||
if (dest_x + width() > parent_size.width()) {
|
|
||||||
dest_x = x - 4 - width();
|
|
||||||
}
|
|
||||||
|
|
||||||
move(dest_x, dest_y);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// 绘制鼠标拖拽时选区矩形的右下顶点的放大图;
|
|
||||||
void OEAmplifier::paintEvent(QPaintEvent *) {
|
|
||||||
QPainter painter(this);
|
|
||||||
|
|
||||||
/// 绘制背景
|
|
||||||
painter.fillRect(rect(), QColor(0, 0, 0, 160));
|
|
||||||
|
|
||||||
QPixmap endPointImage;
|
|
||||||
/// 绘制放大图;
|
|
||||||
const QSize& parent_size = parentWidget()->size();
|
|
||||||
/**
|
|
||||||
* @bug : 在屏幕边缘绘制放大图时会出现图片拉伸
|
|
||||||
* 这里暂时做了边缘检测,若是屏幕边缘则不进行放大图的绘制,和QQ截图的采取方式是一致的。
|
|
||||||
*
|
|
||||||
* @marker: 颜色还是照样识别,但是局部放大的效果暂时禁用
|
|
||||||
*
|
|
||||||
* @note : 解决方法,可以发现边缘时,将不能放大的地方,不描绘,或填充黑色,以避免图片被非预期的拉伸问题。
|
|
||||||
*/
|
|
||||||
if ((cursorPoint_.x() + 15 < parent_size.width() && cursorPoint_.x() - 15 > 0)
|
|
||||||
&& (cursorPoint_.y() + 11 < parent_size.height() && cursorPoint_.y() - 11 > 0)) {
|
|
||||||
endPointImage = originPainting_->
|
|
||||||
copy(QRect(cursorPoint_.x() - 15,
|
|
||||||
cursorPoint_.y() - 11, 30, 22))
|
|
||||||
.scaled(sideLength_, imageHeight_);
|
|
||||||
painter.drawPixmap(0,0, endPointImage);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
endPointImage = originPainting_->
|
|
||||||
copy(QRect(cursorPoint_.x() - 15,
|
|
||||||
cursorPoint_.y() - 11, 30, 22));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// 绘制十字
|
|
||||||
painter.setPen(QPen(QColor(0, 180, 255 , 180), 4));
|
|
||||||
// 竖线;
|
|
||||||
painter.drawLine(QPoint(sideLength_ >> 1, 0),
|
|
||||||
QPoint(sideLength_ >> 1,
|
|
||||||
imageHeight_ - 4));
|
|
||||||
// 横线;
|
|
||||||
painter.drawLine(QPoint(0, imageHeight_ >> 1),
|
|
||||||
QPoint(sideLength_,
|
|
||||||
imageHeight_ >> 1));
|
|
||||||
|
|
||||||
/// 绘制大图内边框
|
|
||||||
painter.setPen(QPen(Qt::white, 2));
|
|
||||||
painter.drawRect(2,2,width()-4, imageHeight_-4);
|
|
||||||
|
|
||||||
/// 绘制外边框
|
|
||||||
painter.setPen(QPen(Qt::black, 1));
|
|
||||||
painter.drawRect(0,0,width()-1,height()-1);
|
|
||||||
|
|
||||||
/// 当前选中矩形的宽高信息;
|
|
||||||
QString select_screen_info = QString("%1×%2")
|
|
||||||
.arg(screenSize_.width()).arg(screenSize_.height());
|
|
||||||
|
|
||||||
/// 当前鼠标像素值的RGB信息
|
|
||||||
QImage image = originPainting_->toImage();
|
|
||||||
QColor cursor_pixel = image.pixel(cursorPoint_);
|
|
||||||
QString select_pt_rgb = QString("RGB:(%1,%2,%3)")
|
|
||||||
.arg(cursor_pixel.red())
|
|
||||||
.arg(cursor_pixel.green())
|
|
||||||
.arg(cursor_pixel.blue());
|
|
||||||
|
|
||||||
/// 绘制坐标轴相关数据
|
|
||||||
painter.setPen(Qt::white);
|
|
||||||
painter.drawText(QPoint(6, imageHeight_+14),select_screen_info);
|
|
||||||
painter.drawText(QPoint(6, imageHeight_+27),select_pt_rgb);
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
/**
|
|
||||||
* @author : 陈鲁勇
|
|
||||||
* @date : 2017年04月
|
|
||||||
* @version: 1.0
|
|
||||||
* @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权;
|
|
||||||
* 除非遵守本许可,否则您不能使用这个文件。
|
|
||||||
* @remarks: 您可以获得该许可的副本:
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* 除非适用法律需要或者书面同意,按本许可分发的软件
|
|
||||||
* 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。
|
|
||||||
* 参见按照本许可控制许可权限及限制的特定语言的许可证。
|
|
||||||
*
|
|
||||||
* 你可以获得该代码的最新版本:
|
|
||||||
*
|
|
||||||
* https://git.oschina.net/Mr_ChenLuYong/screenshot
|
|
||||||
*
|
|
||||||
* 开源社区的所有人都期待与你的共同维护。
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习:
|
|
||||||
*
|
|
||||||
* 博客地址:http://blog.csdn.net/csnd_ayo
|
|
||||||
*
|
|
||||||
* 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915
|
|
||||||
*
|
|
||||||
* 期待你提交Bug,欢迎Issues。
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef OEAMPLIFIER_H
|
|
||||||
#define OEAMPLIFIER_H
|
|
||||||
#include <memory>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @class : OEAmplifier
|
|
||||||
* @brief : 放大取色器
|
|
||||||
* @note : 关于鼠标位置局部放大的操作以及色卡取值的操作
|
|
||||||
*/
|
|
||||||
class OEAmplifier : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit OEAmplifier(std::shared_ptr<QPixmap> originPainting, QWidget *parent = 0);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 大小修改
|
|
||||||
* @param : w 宽度
|
|
||||||
* @param : h 高度
|
|
||||||
* @date : 2017年4月29日
|
|
||||||
*/
|
|
||||||
void onSizeChange(int w, int h);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 大小修改
|
|
||||||
* @param : w 宽度
|
|
||||||
* @param : h 高度
|
|
||||||
* @date : 2017年4月29日
|
|
||||||
*/
|
|
||||||
void onPostionChange(int x, int y);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口自绘事件
|
|
||||||
* @date : 2017年4月29日
|
|
||||||
*/
|
|
||||||
virtual void paintEvent(QPaintEvent *);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/// 外部组件的大小信息
|
|
||||||
QSize screenSize_;
|
|
||||||
/// 鼠标的位置
|
|
||||||
QPoint cursorPoint_;
|
|
||||||
/// 取色放大器的边长
|
|
||||||
int sideLength_;
|
|
||||||
/// 放大区的高度
|
|
||||||
int imageHeight_;
|
|
||||||
/// 屏幕原画
|
|
||||||
std::shared_ptr<QPixmap> originPainting_;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /// OEAMPLIFIER_H
|
|
|
@ -1,141 +0,0 @@
|
||||||
/**
|
|
||||||
* @author : 陈鲁勇
|
|
||||||
* @date : 2017年04月
|
|
||||||
* @version: 1.0
|
|
||||||
* @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权;
|
|
||||||
* 除非遵守本许可,否则您不能使用这个文件。
|
|
||||||
* @remarks: 您可以获得该许可的副本:
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* 除非适用法律需要或者书面同意,按本许可分发的软件
|
|
||||||
* 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。
|
|
||||||
* 参见按照本许可控制许可权限及限制的特定语言的许可证。
|
|
||||||
*
|
|
||||||
* 你可以获得该代码的最新版本:
|
|
||||||
*
|
|
||||||
* https://git.oschina.net/Mr_ChenLuYong/screenshot
|
|
||||||
*
|
|
||||||
* 开源社区的所有人都期待与你的共同维护。
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习:
|
|
||||||
*
|
|
||||||
* 博客地址:http://blog.csdn.net/csnd_ayo
|
|
||||||
*
|
|
||||||
* 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915
|
|
||||||
*
|
|
||||||
* 期待你提交Bug,欢迎Issues。
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "oecommonhelper.h"
|
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QTranslator>
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QDesktopWidget>
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
|
||||||
#include <QDebug>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define WINDOW_BASESIZE_WIDTH (1920)
|
|
||||||
#define WINDOW_BASESIZE_HEIGHT (1080)
|
|
||||||
|
|
||||||
float OECommonHelper::widthMultiplyingPower_ = 0;
|
|
||||||
float OECommonHelper::heightMultiplyingPower_ = 0;
|
|
||||||
|
|
||||||
void OECommonHelper::setStyle(const QString &style) {
|
|
||||||
QFile qss(style);
|
|
||||||
qss.open(QFile::ReadOnly);
|
|
||||||
qApp->setStyleSheet(qss.readAll());
|
|
||||||
qss.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OECommonHelper::setLanguagePack(const QString &language) {
|
|
||||||
// 加载中文包
|
|
||||||
QTranslator translator;
|
|
||||||
translator.load(language);
|
|
||||||
qApp->installTranslator(&translator);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OECommonHelper::moveCenter(QWidget *widget, QRect parentRect) {
|
|
||||||
if (parentRect.isEmpty()) {
|
|
||||||
parentRect = QApplication::desktop()->rect();
|
|
||||||
}
|
|
||||||
widget->move (((parentRect.width() - widget->width()) >> 1),
|
|
||||||
((parentRect.height() - widget->height()) >> 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
const float &OECommonHelper::getWindowWidthMultiplyingPower() {
|
|
||||||
if (widthMultiplyingPower_ == 0) {
|
|
||||||
upWindowSizeMultiplyingPower();
|
|
||||||
}
|
|
||||||
return widthMultiplyingPower_;
|
|
||||||
}
|
|
||||||
|
|
||||||
const float & OECommonHelper::getWindowHeightMultiplyingPower() {
|
|
||||||
if (heightMultiplyingPower_ == 0) {
|
|
||||||
upWindowSizeMultiplyingPower();
|
|
||||||
}
|
|
||||||
return heightMultiplyingPower_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OECommonHelper::upWindowSizeMultiplyingPower() {
|
|
||||||
QSize temp_size = QApplication::desktop()->size();
|
|
||||||
widthMultiplyingPower_ = (float)temp_size.width()
|
|
||||||
/ (float)WINDOW_BASESIZE_WIDTH;
|
|
||||||
heightMultiplyingPower_ = (float)temp_size.height()
|
|
||||||
/ (float)WINDOW_BASESIZE_HEIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OECommonHelper::getSmallestWindowFromCursor(QRect& out_rect) {
|
|
||||||
HWND hwnd;
|
|
||||||
POINT pt;
|
|
||||||
// 获得当前鼠标位置
|
|
||||||
::GetCursorPos(&pt);
|
|
||||||
// 获得当前位置桌面上的子窗口
|
|
||||||
hwnd = ::ChildWindowFromPointEx(::GetDesktopWindow(), pt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE);
|
|
||||||
if (hwnd != NULL) {
|
|
||||||
HWND temp_hwnd;
|
|
||||||
temp_hwnd = hwnd;
|
|
||||||
while (true) {
|
|
||||||
::GetCursorPos(&pt);
|
|
||||||
::ScreenToClient(temp_hwnd, &pt);
|
|
||||||
temp_hwnd = ::ChildWindowFromPointEx(temp_hwnd, pt, CWP_SKIPINVISIBLE);
|
|
||||||
if (temp_hwnd == NULL || temp_hwnd == hwnd)
|
|
||||||
break;
|
|
||||||
hwnd = temp_hwnd;
|
|
||||||
}
|
|
||||||
RECT temp_window;
|
|
||||||
::GetWindowRect(hwnd, &temp_window);
|
|
||||||
out_rect.setRect(temp_window.left,temp_window.top,
|
|
||||||
temp_window.right - temp_window.left,
|
|
||||||
temp_window.bottom - temp_window.top);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OECommonHelper::getCurrentWindowFromCursor(QRect &out_rect)
|
|
||||||
{
|
|
||||||
HWND hwnd;
|
|
||||||
POINT pt;
|
|
||||||
// 获得当前鼠标位置
|
|
||||||
::GetCursorPos(&pt);
|
|
||||||
// 获得当前位置桌面上的子窗口
|
|
||||||
hwnd = ::ChildWindowFromPointEx(::GetDesktopWindow(), pt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE);
|
|
||||||
if (hwnd != NULL) {
|
|
||||||
RECT temp_window;
|
|
||||||
::GetWindowRect(hwnd, &temp_window);
|
|
||||||
out_rect.setRect(temp_window.left, temp_window.top,
|
|
||||||
temp_window.right - temp_window.left,
|
|
||||||
temp_window.bottom - temp_window.top);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
|
@ -1,128 +0,0 @@
|
||||||
/**
|
|
||||||
* @author : 陈鲁勇
|
|
||||||
* @date : 2017年04月
|
|
||||||
* @version: 1.0
|
|
||||||
* @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权;
|
|
||||||
* 除非遵守本许可,否则您不能使用这个文件。
|
|
||||||
* @remarks: 您可以获得该许可的副本:
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* 除非适用法律需要或者书面同意,按本许可分发的软件
|
|
||||||
* 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。
|
|
||||||
* 参见按照本许可控制许可权限及限制的特定语言的许可证。
|
|
||||||
*
|
|
||||||
* 你可以获得该代码的最新版本:
|
|
||||||
*
|
|
||||||
* https://git.oschina.net/Mr_ChenLuYong/screenshot
|
|
||||||
*
|
|
||||||
* 开源社区的所有人都期待与你的共同维护。
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习:
|
|
||||||
*
|
|
||||||
* 博客地址:http://blog.csdn.net/csnd_ayo
|
|
||||||
*
|
|
||||||
* 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915
|
|
||||||
*
|
|
||||||
* 期待你提交Bug,欢迎Issues。
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef COMMONHELPER_H
|
|
||||||
#define COMMONHELPER_H
|
|
||||||
#include <QString>
|
|
||||||
#include <QRect>
|
|
||||||
|
|
||||||
class QWidget;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @class : OECommonHelper
|
|
||||||
* @brief : 通用助手
|
|
||||||
* @note : 完成一些比较常用又通用的功能
|
|
||||||
*/
|
|
||||||
class OECommonHelper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 设置QSS文件
|
|
||||||
* @param : style 文件名
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
* @remark: 如果是qrc路径,请带上 qrc:/
|
|
||||||
**/
|
|
||||||
static void setStyle(const QString &style);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 设置语言包
|
|
||||||
* @param : language 语言包的文件名
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static void setLanguagePack(const QString& language);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 将窗口移动到中心
|
|
||||||
* @param : widget 要移动的窗口
|
|
||||||
* @param : parentRect 矩形几何数据
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static void moveCenter(QWidget* widget, QRect parentRect = {});
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前界面与开发时的界面之间的横向倍率
|
|
||||||
* @return: float 倍率
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static const float& getWindowWidthMultiplyingPower(void);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前界面与开发时的界面之间的纵向倍率
|
|
||||||
* @return: float 倍率
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static const float& getWindowHeightMultiplyingPower(void);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前鼠标位置最小的子窗口
|
|
||||||
* @param : out_rect 矩形 (返回)
|
|
||||||
* @return: 成功:true
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static bool getSmallestWindowFromCursor(QRect &out_rect);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前鼠标位置的窗口
|
|
||||||
* @param : out_rect 矩形 (返回)
|
|
||||||
* @return: 成功:true
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static bool getCurrentWindowFromCursor(QRect &out_rect);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 更新窗口倍率
|
|
||||||
* @author: 陈鲁勇
|
|
||||||
* @date : 2017年04月10日
|
|
||||||
**/
|
|
||||||
static void upWindowSizeMultiplyingPower(void);
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// 窗口横向倍率
|
|
||||||
static float widthMultiplyingPower_;
|
|
||||||
/// 窗口纵向倍率
|
|
||||||
static float heightMultiplyingPower_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /// COMMONHELPER_H
|
|
|
@ -1,86 +0,0 @@
|
||||||
#include "oemodelview.h"
|
|
||||||
|
|
||||||
#include <QPen>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QPoint>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QtMath>
|
|
||||||
/// @test : 测试变量
|
|
||||||
QPoint startPoint_;
|
|
||||||
QPoint endPoint_;
|
|
||||||
|
|
||||||
|
|
||||||
OEModelView::OEModelView(MODEL model,
|
|
||||||
QWidget *parent) : QWidget(parent),
|
|
||||||
color_(Qt::red) {
|
|
||||||
/// 确定画图样式
|
|
||||||
switch (model) {
|
|
||||||
case MODEL::Arrows:
|
|
||||||
{
|
|
||||||
drawFunc_ = &OEModelView::drawArrows;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
drawFunc_ = &OEModelView::drawArrows;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OEModelView::paintEvent(QPaintEvent *) {
|
|
||||||
QPainter paiter(this);
|
|
||||||
|
|
||||||
/// @test : 测试变量
|
|
||||||
startPoint_ = QPoint(width(),height());
|
|
||||||
endPoint_ = {};
|
|
||||||
|
|
||||||
/// 绘制图形
|
|
||||||
(this->*drawFunc_)(startPoint_, endPoint_, paiter);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OEModelView::drawArrows(const QPoint& startPoint,
|
|
||||||
const QPoint& endPoint,
|
|
||||||
QPainter &paiter) {
|
|
||||||
/// 消锯齿
|
|
||||||
paiter.setRenderHint(QPainter::Antialiasing, true);
|
|
||||||
/// 创建画笔,设置画刷
|
|
||||||
QPen pen;
|
|
||||||
pen.setColor(color_);
|
|
||||||
pen.setWidth(1);
|
|
||||||
paiter.setPen(pen);
|
|
||||||
paiter.setBrush(color_);
|
|
||||||
|
|
||||||
|
|
||||||
/// 箭头部分三角形的腰长
|
|
||||||
double par = 15.0;
|
|
||||||
double slopy = atan2((endPoint.y() - startPoint.y()),
|
|
||||||
(endPoint.x() - startPoint.x()));
|
|
||||||
double cos_y = cos(slopy);
|
|
||||||
double sin_y = sin(slopy);
|
|
||||||
QPoint head_point1 = QPoint(endPoint.x() + int(-par*cos_y - (par / 2.0 * sin_y)),
|
|
||||||
endPoint.y() + int(-par*sin_y + (par / 2.0 * cos_y)));
|
|
||||||
QPoint head_point2 = QPoint(endPoint.x() + int(-par*cos_y + (par / 2.0 * sin_y)),
|
|
||||||
endPoint.y() - int(par / 2.0*cos_y + par * sin_y));
|
|
||||||
QPoint head_points[3] = { endPoint, head_point1, head_point2 };
|
|
||||||
/// 绘制箭头部分
|
|
||||||
paiter.drawPolygon(head_points, 3);
|
|
||||||
|
|
||||||
|
|
||||||
/// 计算箭身部分
|
|
||||||
int offset_x = int(par*sin_y / 3);
|
|
||||||
int offset_y = int(par*cos_y / 3);
|
|
||||||
QPoint body_point1, body_point2;
|
|
||||||
body_point1 = QPoint(endPoint.x() + int(-par*cos_y - (par / 2.0*sin_y)) +
|
|
||||||
offset_x, endPoint.y() + int(-par*sin_y + (par / 2.0*cos_y)) - offset_y);
|
|
||||||
body_point2 = QPoint(endPoint.x() + int(-par*cos_y + (par / 2.0*sin_y) - offset_x),
|
|
||||||
endPoint.y() - int(par / 2.0*cos_y + par*sin_y) + offset_y);
|
|
||||||
QPoint body_points[3] = { startPoint, body_point1, body_point2 };
|
|
||||||
/// 绘制箭身部分
|
|
||||||
paiter.drawPolygon(body_points, 3);
|
|
||||||
|
|
||||||
}
|
|
||||||
void OEModelView::onColor(const QColor &color) {
|
|
||||||
color_ = color;
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
#ifndef OEMODELVIEW_H
|
|
||||||
#define OEMODELVIEW_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QMap>
|
|
||||||
#include <QColor>
|
|
||||||
#include <QPoint>
|
|
||||||
|
|
||||||
class OEModelView : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 模型种类
|
|
||||||
*/
|
|
||||||
enum MODEL{
|
|
||||||
Arrows = 0, /// 箭头
|
|
||||||
Rectangle = 1, /// 矩形
|
|
||||||
Roundness /// 圆形
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef void (OEModelView::*PDRAWFUNC)
|
|
||||||
(const QPoint &,const QPoint &, QPainter&);
|
|
||||||
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit OEModelView(MODEL model = MODEL::Arrows,
|
|
||||||
QWidget *parent = 0);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 自绘事件
|
|
||||||
*/
|
|
||||||
virtual void paintEvent(QPaintEvent *);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void drawArrows(const QPoint &startPoint,
|
|
||||||
const QPoint &endPoint,
|
|
||||||
QPainter& paiter);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
|
|
||||||
void onColor(const QColor &color);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QColor color_;
|
|
||||||
PDRAWFUNC drawFunc_;
|
|
||||||
/// @bug : 莫名,开启此处变量的声明,程序就会崩溃。
|
|
||||||
// QPoint ssPoint331_;
|
|
||||||
// QPoint esoint233_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // OEMODELVIEW_H
|
|
|
@ -1,768 +0,0 @@
|
||||||
/**
|
|
||||||
* @author : 陈鲁勇
|
|
||||||
* @date : 2017年04月
|
|
||||||
* @version: 1.0
|
|
||||||
* @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权;
|
|
||||||
* 除非遵守本许可,否则您不能使用这个文件。
|
|
||||||
* @remarks: 您可以获得该许可的副本:
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* 除非适用法律需要或者书面同意,按本许可分发的软件
|
|
||||||
* 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。
|
|
||||||
* 参见按照本许可控制许可权限及限制的特定语言的许可证。
|
|
||||||
*
|
|
||||||
* 你可以获得该代码的最新版本:
|
|
||||||
*
|
|
||||||
* https://git.oschina.net/Mr_ChenLuYong/screenshot
|
|
||||||
*
|
|
||||||
* 开源社区的所有人都期待与你的共同维护。
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习:
|
|
||||||
*
|
|
||||||
* 博客地址:http://blog.csdn.net/csnd_ayo
|
|
||||||
*
|
|
||||||
* 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915
|
|
||||||
*
|
|
||||||
* 期待你提交Bug,欢迎Issues。
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "oescreenshot.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QMouseEvent>
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QClipboard>
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QScreen>
|
|
||||||
#include <QCursor>
|
|
||||||
#include <QMutex>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QPen>
|
|
||||||
#ifndef QT_NO_DEBUG
|
|
||||||
#include <QDebug>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include "oeamplifier.h"
|
|
||||||
#include "oecommonhelper.h"
|
|
||||||
|
|
||||||
|
|
||||||
/// 鼠标按钮图片的十六进制数据
|
|
||||||
static const unsigned char uc_mouse_image[] = {
|
|
||||||
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52
|
|
||||||
,0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x2D, 0x08, 0x06, 0x00, 0x00, 0x00, 0x52, 0xE9, 0x60
|
|
||||||
,0xA2, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B
|
|
||||||
,0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x01, 0x40, 0x49, 0x44, 0x41, 0x54, 0x58, 0x85
|
|
||||||
,0xED, 0xD5, 0x21, 0x6E, 0xC3, 0x30, 0x14, 0xC6, 0xF1, 0xFF, 0x9B, 0xC6, 0x36, 0x30, 0x38, 0xA9
|
|
||||||
,0x05, 0x01, 0x05, 0x81, 0x05, 0x03, 0x39, 0xCA, 0x60, 0x8F, 0xD2, 0x03, 0xEC, 0x10, 0x3B, 0x46
|
|
||||||
,0xC1, 0xC0, 0xC6, 0x0A, 0x3B, 0x96, 0xB1, 0x80, 0x82, 0xC1, 0x56, 0x2A, 0xFF, 0x06, 0xE2, 0x36
|
|
||||||
,0x75, 0x9A, 0xB4, 0xCA, 0xEC, 0x4E, 0x9A, 0xE4, 0x2F, 0xB2, 0x42, 0x22, 0xFF, 0xF2, 0xFC, 0x9C
|
|
||||||
,0x18, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0xFE, 0x55, 0xE4, 0xC6, 0xA0
|
|
||||||
,0xDC, 0xC4, 0x71, 0x87, 0xC1, 0xC1, 0x68, 0x01, 0xCC, 0x06, 0xC2, 0x51, 0xD0, 0x29, 0xB0, 0x18
|
|
||||||
,0x00, 0xDF, 0xC6, 0x40, 0x33, 0x37, 0x84, 0x30, 0x4C, 0x80, 0x85, 0xCE, 0x7B, 0x2E, 0x2A, 0x91
|
|
||||||
,0x84, 0x24, 0xBE, 0x25, 0xDE, 0x25, 0x5E, 0x2F, 0x6E, 0xAE, 0xD0, 0x37, 0x92, 0x10, 0xF0, 0x09
|
|
||||||
,0x54, 0x40, 0xE9, 0xEE, 0x15, 0xC6, 0xA2, 0x77, 0xFE, 0xE0, 0xE5, 0x85, 0x8F, 0x16, 0x58, 0xDF
|
|
||||||
,0x35, 0x06, 0x5B, 0xD3, 0xB9, 0xD4, 0x11, 0xD0, 0xA5, 0x8F, 0xDE, 0x57, 0x75, 0x83, 0x73, 0x50
|
|
||||||
,0x06, 0xF6, 0x72, 0x0A, 0x47, 0x40, 0x57, 0x0D, 0x38, 0xDE, 0xC0, 0x04, 0x6F, 0x68, 0x05, 0x36
|
|
||||||
,0xF5, 0xE1, 0x08, 0x3D, 0xCD, 0xEA, 0xEA, 0x5A, 0xD8, 0xBE, 0x5A, 0x46, 0xB0, 0x05, 0x1E, 0xAC
|
|
||||||
,0xF1, 0xC2, 0xD1, 0xCC, 0x01, 0x6D, 0x74, 0x02, 0xDB, 0x3B, 0xBF, 0xD3, 0x73, 0x07, 0x87, 0x2F
|
|
||||||
,0xEF, 0x53, 0x07, 0x38, 0x82, 0x2F, 0xF6, 0xFB, 0xB8, 0x81, 0x73, 0x41, 0x69, 0x28, 0x3A, 0x7A
|
|
||||||
,0x5C, 0xDD, 0x73, 0xCF, 0x3A, 0x86, 0xA3, 0x05, 0x87, 0xEA, 0xCC, 0x60, 0xA1, 0x06, 0x75, 0x89
|
|
||||||
,0xFE, 0x77, 0x92, 0x76, 0x68, 0x23, 0xEF, 0x88, 0xD3, 0x4C, 0xA8, 0x10, 0x7A, 0xD4, 0xEF, 0x8E
|
|
||||||
,0xBE, 0x8B, 0x68, 0x79, 0x3A, 0xB1, 0x72, 0xE1, 0xAE, 0xBC, 0x13, 0x0D, 0xDE, 0xBD, 0x3D, 0xF3
|
|
||||||
,0x08, 0x15, 0xD4, 0xDF, 0x4C, 0x06, 0x36, 0xF7, 0x9E, 0x09, 0xED, 0xE9, 0x99, 0x97, 0x3E, 0x42
|
|
||||||
,0xFF, 0x30, 0x42, 0x4B, 0xA1, 0x8D, 0xD8, 0xE9, 0x2A, 0xBD, 0xED, 0x41, 0x25, 0x2A, 0x89, 0x37
|
|
||||||
,0x1F, 0xBD, 0xEA, 0x61, 0x8B, 0x5F, 0xDD, 0xC1, 0xFA, 0x01, 0xD8, 0xA3, 0x8F, 0xFB, 0xCA, 0x70
|
|
||||||
,0x16, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OEScreenshot * OEScreenshot::self_ = nullptr;
|
|
||||||
bool OEScreenshot::isActivity_ = false;
|
|
||||||
bool OEScreen::isInit_ = false;
|
|
||||||
|
|
||||||
OEScreenshot::OEScreenshot(QWidget *parent) : QWidget(parent),
|
|
||||||
isLeftPressed_ (false), backgroundScreen_(nullptr),
|
|
||||||
originPainting_(nullptr), screenTool_(nullptr) {
|
|
||||||
/// 初始化鼠标
|
|
||||||
initCursor();
|
|
||||||
/// 截取屏幕信息
|
|
||||||
initGlobalScreen();
|
|
||||||
/// 初始化鼠标放大器
|
|
||||||
initAmplifier();
|
|
||||||
/// 初始化大小感知器
|
|
||||||
initMeasureWidget();
|
|
||||||
/// 全屏窗口
|
|
||||||
showFullScreen();
|
|
||||||
/// 窗口与显示屏对齐
|
|
||||||
setGeometry(getScreenRect());
|
|
||||||
/// 霸道置顶
|
|
||||||
onEgoistic();
|
|
||||||
/// 开启鼠标实时追踪
|
|
||||||
setMouseTracking(true);
|
|
||||||
/// 更新鼠标的位置
|
|
||||||
emit cursorPosChange(cursor().pos().x(), cursor().pos().y());
|
|
||||||
/// 更新鼠标区域窗口
|
|
||||||
updateMouse();
|
|
||||||
/// 展示窗口
|
|
||||||
show();
|
|
||||||
}
|
|
||||||
|
|
||||||
OEScreenshot::~OEScreenshot(void) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief:窗口实例
|
|
||||||
* @return:OEScreenshot
|
|
||||||
*/
|
|
||||||
OEScreenshot *OEScreenshot::Instance(void) {
|
|
||||||
if (!isActivity_ && self_) {
|
|
||||||
destroy();
|
|
||||||
}
|
|
||||||
static QMutex mutex;
|
|
||||||
if (!self_) {
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
if (!self_) {
|
|
||||||
isActivity_ = true;
|
|
||||||
self_ = new OEScreenshot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return self_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::destroy(void) {
|
|
||||||
if (!isActivity_ && self_) {
|
|
||||||
delete self_;
|
|
||||||
self_ = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::hideEvent(QHideEvent *) {
|
|
||||||
isActivity_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OEScreenshot::closeEvent(QCloseEvent *) {
|
|
||||||
isActivity_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::mouseDoubleClickEvent(QMouseEvent *) {
|
|
||||||
emit doubleClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化放大镜 (色彩采集器)
|
|
||||||
*/
|
|
||||||
void OEScreenshot::initAmplifier(std::shared_ptr<QPixmap> originPainting) {
|
|
||||||
std::shared_ptr<QPixmap> temp_pm = originPainting;
|
|
||||||
if (temp_pm == nullptr) {
|
|
||||||
temp_pm = originPainting_;
|
|
||||||
}
|
|
||||||
amplifierTool_.reset(new OEAmplifier(temp_pm, this));
|
|
||||||
connect(this,SIGNAL(cursorPosChange(int,int)),
|
|
||||||
amplifierTool_.get(), SLOT(onPostionChange(int,int)));
|
|
||||||
amplifierTool_->show();
|
|
||||||
amplifierTool_->raise();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::initMeasureWidget(void)
|
|
||||||
{
|
|
||||||
rectTool_.reset(new OERect(this));
|
|
||||||
rectTool_->raise();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 功能:获得当前屏幕的大小
|
|
||||||
*/
|
|
||||||
const QRect &OEScreenshot::getScreenRect(void) {
|
|
||||||
if (!desktopRect_.isEmpty()) {
|
|
||||||
return desktopRect_;
|
|
||||||
}
|
|
||||||
/// 获得屏幕个数
|
|
||||||
int temp_screen_num = QApplication::screens().size();
|
|
||||||
/// 获得屏幕大小
|
|
||||||
desktopRect_ = QApplication::desktop()->rect();
|
|
||||||
if (temp_screen_num != 1) {
|
|
||||||
/// 多屏幕策略
|
|
||||||
const int& temp = desktopRect_.width() -
|
|
||||||
(desktopRect_.width() / temp_screen_num);
|
|
||||||
/// 重新设置矩形
|
|
||||||
desktopRect_ = QRect(-temp, 0,
|
|
||||||
desktopRect_.width(), desktopRect_.height());
|
|
||||||
}
|
|
||||||
return desktopRect_;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<QPixmap> OEScreenshot::initGlobalScreen(void) {
|
|
||||||
if (backgroundScreen_.get() != nullptr) {
|
|
||||||
return backgroundScreen_;
|
|
||||||
}
|
|
||||||
/// 获得屏幕原画
|
|
||||||
std::shared_ptr<QPixmap> temp_screen = getGlobalScreen();
|
|
||||||
|
|
||||||
/// 制作暗色屏幕背景
|
|
||||||
QPixmap temp_dim_pix(temp_screen->width(), temp_screen->height());
|
|
||||||
temp_dim_pix.fill((QColor(0, 0, 0, 160)));
|
|
||||||
backgroundScreen_.reset(new QPixmap(*temp_screen));
|
|
||||||
QPainter p(backgroundScreen_.get());
|
|
||||||
p.drawPixmap(0, 0, temp_dim_pix);
|
|
||||||
|
|
||||||
return backgroundScreen_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 获得屏幕的原画
|
|
||||||
* 返回:QPixmap* 指针
|
|
||||||
*/
|
|
||||||
std::shared_ptr<QPixmap> OEScreenshot::getGlobalScreen(void) {
|
|
||||||
if (originPainting_.get() == nullptr) {
|
|
||||||
/// 截取当前桌面,作为截屏的背景图
|
|
||||||
QScreen *screen = QGuiApplication::primaryScreen();
|
|
||||||
const QRect& temp_rect = getScreenRect();
|
|
||||||
originPainting_.reset(new QPixmap(screen->grabWindow(0, temp_rect.x(),
|
|
||||||
temp_rect.y(), temp_rect.width(),
|
|
||||||
temp_rect.height())));
|
|
||||||
}
|
|
||||||
return originPainting_;
|
|
||||||
}
|
|
||||||
void OEScreenshot::onEgoistic(void)
|
|
||||||
{
|
|
||||||
/// 窗口置顶
|
|
||||||
#ifdef Q_OS_WIN32
|
|
||||||
// SetWindowPos(HWND)this->winId(),HWND_TOPMOST,this->pos().x(),this->pos().y(),this->width(),this->height(),SWP_SHOWWINDOW);
|
|
||||||
#else
|
|
||||||
Qt::WindowFlags flags = windowFlags();
|
|
||||||
flags |= Qt::WindowStaysOnTopHint;
|
|
||||||
setWindowFlags(flags);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 初始化鼠标
|
|
||||||
* 参数:_ico 鼠标图片的资源文件
|
|
||||||
*/
|
|
||||||
void OEScreenshot::initCursor(const QString& ico) {
|
|
||||||
QPixmap pixmap;
|
|
||||||
if (ico.isEmpty()) {
|
|
||||||
pixmap.loadFromData(uc_mouse_image, sizeof(uc_mouse_image));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pixmap.load(ico);
|
|
||||||
}
|
|
||||||
QCursor cursor;
|
|
||||||
cursor = QCursor(pixmap, 15, 23);
|
|
||||||
setCursor(cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<OEScreen> OEScreenshot::createScreen(const QPoint &pos) {
|
|
||||||
if (screenTool_.get() == nullptr) {
|
|
||||||
/// 创建截图器
|
|
||||||
screenTool_.reset(new OEScreen(originPainting_, pos, this));
|
|
||||||
/// 建立信号连接
|
|
||||||
connect (this, SIGNAL(cursorPosChange(int,int)),
|
|
||||||
screenTool_.get(),SLOT(onMouseChange(int,int)));
|
|
||||||
/// 建立主界面双击保存信号关联
|
|
||||||
connect (this, SIGNAL(doubleClick()),
|
|
||||||
screenTool_.get(),SLOT(onSaveScreen()));
|
|
||||||
/// 建立截图器大小关联
|
|
||||||
connect(screenTool_.get(), SIGNAL(sizeChange(int,int)),
|
|
||||||
rectTool_.get(), SLOT(onSizeChange(int,int)));
|
|
||||||
connect(screenTool_.get(), SIGNAL(sizeChange(int,int)),
|
|
||||||
amplifierTool_.get(), SLOT(onSizeChange(int,int)));
|
|
||||||
/// 建立截图器与感知器的位置关联
|
|
||||||
connect(screenTool_.get(), SIGNAL(postionChange(int,int)),
|
|
||||||
rectTool_.get(), SLOT(onPostionChange(int,int)));
|
|
||||||
|
|
||||||
/// 获得截图器当前起始位置
|
|
||||||
startPoint_ = pos;
|
|
||||||
isLeftPressed_ = true;
|
|
||||||
}
|
|
||||||
return screenTool_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::destroyScreen() {
|
|
||||||
if (screenTool_.get() != nullptr) {
|
|
||||||
/// 断开信号资源
|
|
||||||
disconnect (this, SIGNAL(doubleClick()),
|
|
||||||
screenTool_.get(),SLOT(onSaveScreen()));
|
|
||||||
disconnect(screenTool_.get(), SIGNAL(sizeChange(int,int)),
|
|
||||||
rectTool_.get(), SLOT(onSizeChange(int,int)));
|
|
||||||
disconnect(screenTool_.get(), SIGNAL(postionChange(int,int)),
|
|
||||||
rectTool_.get(), SLOT(onPostionChange(int,int)));
|
|
||||||
/// 清理工具
|
|
||||||
screenTool_.reset();
|
|
||||||
screenTool_ = nullptr;
|
|
||||||
isLeftPressed_ = false;
|
|
||||||
update();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::mousePressEvent(QMouseEvent *e) {
|
|
||||||
if (e->button() == Qt::LeftButton) {
|
|
||||||
createScreen(e->pos());
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::mouseReleaseEvent(QMouseEvent *e) {
|
|
||||||
if (e->button() == Qt::RightButton) {
|
|
||||||
if (screenTool_.get() != nullptr) {
|
|
||||||
rectTool_->hide();
|
|
||||||
amplifierTool_->onPostionChange(e->x(), e->y());
|
|
||||||
amplifierTool_->show();
|
|
||||||
return destroyScreen();
|
|
||||||
}
|
|
||||||
close();
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
else if (isLeftPressed_ == true
|
|
||||||
&& e->button() == Qt::LeftButton) {
|
|
||||||
/// 选择窗口选区
|
|
||||||
if (startPoint_ == e->pos()
|
|
||||||
&& !windowRect_.isEmpty()) {
|
|
||||||
screenTool_->setGeometry(windowRect_);
|
|
||||||
screenTool_->show();
|
|
||||||
windowRect_ = {};
|
|
||||||
}
|
|
||||||
/// 断开鼠标移动的信号
|
|
||||||
disconnect (this, SIGNAL(cursorPosChange(int,int)),
|
|
||||||
screenTool_.get(),SLOT(onMouseChange(int,int)));
|
|
||||||
/// 隐藏放大器
|
|
||||||
amplifierTool_->hide();
|
|
||||||
/// 断开截图器的大小修改信号
|
|
||||||
disconnect (screenTool_.get(), SIGNAL(sizeChange(int,int)),
|
|
||||||
amplifierTool_.get(),SLOT(onSizeChange(int,int)));
|
|
||||||
isLeftPressed_ = false;
|
|
||||||
}
|
|
||||||
QWidget::mouseReleaseEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::mouseMoveEvent(QMouseEvent *e) {
|
|
||||||
emit cursorPosChange(e->x(), e->y());
|
|
||||||
if (isLeftPressed_) {
|
|
||||||
amplifierTool_->raise();
|
|
||||||
windowRect_ = {};
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
else if (isLeftPressed_ == false
|
|
||||||
&& false == OEScreen::state()){
|
|
||||||
/// 霸道置顶
|
|
||||||
onEgoistic();
|
|
||||||
|
|
||||||
/// 更新当前鼠标选中的窗口
|
|
||||||
updateMouse();
|
|
||||||
}
|
|
||||||
QWidget::mouseMoveEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::paintEvent(QPaintEvent *) {
|
|
||||||
QPainter painter(this);
|
|
||||||
/// 画全屏图
|
|
||||||
painter.drawPixmap(0,0,desktopRect_.width(),
|
|
||||||
desktopRect_.height(), *backgroundScreen_);
|
|
||||||
|
|
||||||
if (!windowRect_.isEmpty()) {
|
|
||||||
/// 绘制选区
|
|
||||||
QPen pen = painter.pen();
|
|
||||||
pen.setColor(QColor(0,175,255));
|
|
||||||
pen.setWidth(2);
|
|
||||||
painter.setPen(pen);
|
|
||||||
painter.drawRect(windowRect_.x(),windowRect_.y(),
|
|
||||||
windowRect_.width(),windowRect_.height());
|
|
||||||
painter.drawPixmap(QPoint(windowRect_.x(),windowRect_.y()),
|
|
||||||
*originPainting_, windowRect_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::updateMouse(void) {
|
|
||||||
/// 获取当前鼠标选中的窗口
|
|
||||||
::EnableWindow((HWND)winId(), FALSE);
|
|
||||||
OECommonHelper::getSmallestWindowFromCursor(windowRect_);
|
|
||||||
QPoint temp_pt = mapFromGlobal(QPoint(windowRect_.x(), windowRect_.y()));
|
|
||||||
windowRect_ = QRect(temp_pt.x(), temp_pt.y(),
|
|
||||||
windowRect_.width(), windowRect_.height());
|
|
||||||
::EnableWindow((HWND)winId(), TRUE);
|
|
||||||
amplifierTool_->onSizeChange(windowRect_.width(),windowRect_.height());
|
|
||||||
emit findChildWind(windowRect_);
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreenshot::keyPressEvent(QKeyEvent *e) {
|
|
||||||
/// Esc 键退出截图;
|
|
||||||
if (e->key() == Qt::Key_Escape) {
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e->ignore();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OERect::OERect(QWidget *parent) : QWidget(parent) {
|
|
||||||
|
|
||||||
/// 设置感知器默认大小
|
|
||||||
setFixedSize(95 * OECommonHelper::getWindowHeightMultiplyingPower(),
|
|
||||||
20 * OECommonHelper::getWindowHeightMultiplyingPower());
|
|
||||||
|
|
||||||
/// 填充默认背景
|
|
||||||
backgroundPixmap_.reset(new QPixmap(width(),height()));
|
|
||||||
backgroundPixmap_->fill((QColor(8, 8, 8, 160)));
|
|
||||||
|
|
||||||
/// 默认隐藏
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OERect::paintEvent(QPaintEvent *) {
|
|
||||||
QPainter painter(this);
|
|
||||||
painter.drawPixmap(rect(),*backgroundPixmap_);
|
|
||||||
painter.setPen(QPen(QColor(Qt::white)));
|
|
||||||
painter.drawText(rect(), Qt::AlignCenter, info_);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OERect::onPostionChange(int x, int y) {
|
|
||||||
if (x < 0) x = 0;
|
|
||||||
if (y < 0) y = 0;
|
|
||||||
const int& ry = y - height() - 1;
|
|
||||||
if (ry < 0) {
|
|
||||||
this->raise();
|
|
||||||
}
|
|
||||||
move(x, ((ry < 0) ? y : ry));
|
|
||||||
show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OERect::onSizeChange(int w, int h) {
|
|
||||||
info_ = QString("%1 × %2").arg(w).arg(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OEScreen::OEScreen(std::shared_ptr<QPixmap> originPainting, QPoint pos, QWidget *parent)
|
|
||||||
: QWidget(parent), direction_(NONE), originPoint_(pos),
|
|
||||||
isPressed_(false), originPainting_(originPainting) {
|
|
||||||
menu_ = new QMenu(this);
|
|
||||||
menu_->addAction("完成截图", this, SLOT(onSaveScreen()));
|
|
||||||
menu_->addAction("保存", this, SLOT(onSaveScreenOther()));
|
|
||||||
menu_->addSeparator();
|
|
||||||
menu_->addAction("退出截图", this, SLOT(quitScreenshot()));
|
|
||||||
|
|
||||||
/// 双击即完成
|
|
||||||
connect(this, SIGNAL(doubleClick()),
|
|
||||||
this, SLOT(onSaveScreen()));
|
|
||||||
|
|
||||||
/// 开启鼠标实时追踪
|
|
||||||
setMouseTracking(true);
|
|
||||||
/// 默认隐藏
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
OEScreen::DIRECTION OEScreen::getRegion(const QPoint &cursor) {
|
|
||||||
if (!isInit_) {
|
|
||||||
return NONE;
|
|
||||||
}
|
|
||||||
OEScreen::DIRECTION ret_dir = NONE;
|
|
||||||
// left upper
|
|
||||||
QPoint pt_lu = mapToParent(rect().topLeft());
|
|
||||||
// right lower
|
|
||||||
QPoint pt_rl = mapToParent(rect().bottomRight());
|
|
||||||
|
|
||||||
int x = cursor.x();
|
|
||||||
int y = cursor.y();
|
|
||||||
|
|
||||||
/// 获得鼠标当前所处窗口的边界方向
|
|
||||||
if(pt_lu.x() + PADDING_ >= x
|
|
||||||
&& pt_lu.x() <= x
|
|
||||||
&& pt_lu.y() + PADDING_ >= y
|
|
||||||
&& pt_lu.y() <= y) {
|
|
||||||
// 左上角
|
|
||||||
ret_dir = LEFTUPPER;
|
|
||||||
this->setCursor(QCursor(Qt::SizeFDiagCursor));
|
|
||||||
} else if(x >= pt_rl.x() - PADDING_
|
|
||||||
&& x <= pt_rl.x()
|
|
||||||
&& y >= pt_rl.y() - PADDING_
|
|
||||||
&& y <= pt_rl.y()) {
|
|
||||||
// 右下角
|
|
||||||
ret_dir = RIGHTLOWER;
|
|
||||||
this->setCursor(QCursor(Qt::SizeFDiagCursor));
|
|
||||||
} else if(x <= pt_lu.x() + PADDING_
|
|
||||||
&& x >= pt_lu.x()
|
|
||||||
&& y >= pt_rl.y() - PADDING_
|
|
||||||
&& y <= pt_rl.y()) {
|
|
||||||
// 左下角
|
|
||||||
ret_dir = LEFTLOWER;
|
|
||||||
this->setCursor(QCursor(Qt::SizeBDiagCursor));
|
|
||||||
} else if(x <= pt_rl.x()
|
|
||||||
&& x >= pt_rl.x() - PADDING_
|
|
||||||
&& y >= pt_lu.y()
|
|
||||||
&& y <= pt_lu.y() + PADDING_) {
|
|
||||||
// 右上角
|
|
||||||
ret_dir = RIGHTUPPER;
|
|
||||||
this->setCursor(QCursor(Qt::SizeBDiagCursor));
|
|
||||||
} else if(x <= pt_lu.x() + PADDING_
|
|
||||||
&& x >= pt_lu.x()) {
|
|
||||||
// 左边
|
|
||||||
ret_dir = LEFT;
|
|
||||||
this->setCursor(QCursor(Qt::SizeHorCursor));
|
|
||||||
} else if( x <= pt_rl.x()
|
|
||||||
&& x >= pt_rl.x() - PADDING_) {
|
|
||||||
// 右边
|
|
||||||
ret_dir = RIGHT;
|
|
||||||
this->setCursor(QCursor(Qt::SizeHorCursor));
|
|
||||||
}else if(y >= pt_lu.y()
|
|
||||||
&& y <= pt_lu.y() + PADDING_){
|
|
||||||
// 上边
|
|
||||||
ret_dir = UPPER;
|
|
||||||
this->setCursor(QCursor(Qt::SizeVerCursor));
|
|
||||||
} else if(y <= pt_rl.y()
|
|
||||||
&& y >= pt_rl.y() - PADDING_) {
|
|
||||||
// 下边
|
|
||||||
ret_dir = LOWER;
|
|
||||||
this->setCursor(QCursor(Qt::SizeVerCursor));
|
|
||||||
}else {
|
|
||||||
// 默认
|
|
||||||
ret_dir = NONE;
|
|
||||||
this->setCursor(QCursor(Qt::SizeAllCursor));
|
|
||||||
}
|
|
||||||
return ret_dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OEScreen::contextMenuEvent(QContextMenuEvent *) {
|
|
||||||
/// 在鼠标位置弹射出菜单栏
|
|
||||||
menu_->exec(cursor().pos());
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::mouseDoubleClickEvent(QMouseEvent *e) {
|
|
||||||
if (e->button() == Qt::LeftButton) {
|
|
||||||
emit doubleClick();
|
|
||||||
e->accept();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::mousePressEvent(QMouseEvent *e) {
|
|
||||||
if (e->button() == Qt::LeftButton) {
|
|
||||||
isPressed_ = true;
|
|
||||||
if(direction_ != NONE) {
|
|
||||||
this->mouseGrabber();
|
|
||||||
}
|
|
||||||
/// @bug :这里可能存在问题, 不应当使用globalPos
|
|
||||||
movePos_ = e->globalPos() - pos();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::mouseReleaseEvent(QMouseEvent * e) {
|
|
||||||
if (e->button() == Qt::LeftButton) {
|
|
||||||
isPressed_ = false;
|
|
||||||
if(direction_ != NONE) {
|
|
||||||
setCursor(QCursor(Qt::SizeAllCursor));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::mouseMoveEvent(QMouseEvent * e) {
|
|
||||||
QPoint gloPoint = mapToParent(e->pos());
|
|
||||||
// left upper
|
|
||||||
QPoint pt_lu = mapToParent(rect().topLeft());
|
|
||||||
// left lower
|
|
||||||
QPoint pt_ll = mapToParent(rect().bottomLeft());
|
|
||||||
// right lower
|
|
||||||
QPoint pt_rl = mapToParent(rect().bottomRight());
|
|
||||||
// right upper
|
|
||||||
QPoint pt_ru = mapToParent(rect().topRight());
|
|
||||||
if(!isPressed_) {
|
|
||||||
/// 检查鼠标鼠标方向
|
|
||||||
direction_ = getRegion(gloPoint);
|
|
||||||
|
|
||||||
/// 根据方位判断拖拉对应支点
|
|
||||||
switch(direction_) {
|
|
||||||
case NONE:
|
|
||||||
case RIGHT:
|
|
||||||
case RIGHTLOWER:
|
|
||||||
originPoint_ = pt_lu;
|
|
||||||
break;
|
|
||||||
case RIGHTUPPER:
|
|
||||||
originPoint_ = pt_ll;
|
|
||||||
break;
|
|
||||||
case LEFT:
|
|
||||||
case LEFTLOWER:
|
|
||||||
originPoint_ = pt_ru;
|
|
||||||
break;
|
|
||||||
case LEFTUPPER:
|
|
||||||
case UPPER:
|
|
||||||
originPoint_ = pt_rl;
|
|
||||||
break;
|
|
||||||
case LOWER:
|
|
||||||
originPoint_ = pt_lu;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(direction_ != NONE) {
|
|
||||||
const int& global_x = gloPoint.x();
|
|
||||||
/// 鼠标进行拖拉拽
|
|
||||||
switch(direction_) {
|
|
||||||
case LEFT:
|
|
||||||
return onMouseChange(global_x, pt_ll.y() + 1);
|
|
||||||
case RIGHT:
|
|
||||||
return onMouseChange(global_x, pt_rl.y() + 1);
|
|
||||||
case UPPER:
|
|
||||||
return onMouseChange(pt_lu.x(), gloPoint.y());
|
|
||||||
case LOWER:
|
|
||||||
return onMouseChange(pt_rl.x() + 1, gloPoint.y());
|
|
||||||
case LEFTUPPER:
|
|
||||||
case RIGHTUPPER:
|
|
||||||
case LEFTLOWER:
|
|
||||||
case RIGHTLOWER:
|
|
||||||
return onMouseChange(global_x, gloPoint.y());
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/// 窗口的移动
|
|
||||||
/// @bug :这里可能存在问题, 不应当使用globalPos
|
|
||||||
move(e->globalPos() - movePos_);
|
|
||||||
movePos_ = e->globalPos() - pos();
|
|
||||||
e->accept();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
currentRect_ = geometry();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::moveEvent(QMoveEvent *) {
|
|
||||||
emit postionChange(x(), y());
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::resizeEvent(QResizeEvent *) {
|
|
||||||
listMarker_.clear();
|
|
||||||
|
|
||||||
/// 重新计算八个锚点
|
|
||||||
// 角点
|
|
||||||
listMarker_.push_back(QPoint(0, 0));
|
|
||||||
listMarker_.push_back(QPoint(width(), 0));
|
|
||||||
listMarker_.push_back(QPoint(0, height()));
|
|
||||||
listMarker_.push_back(QPoint(width(), height()));
|
|
||||||
|
|
||||||
// 中点
|
|
||||||
listMarker_.push_back(QPoint((width() >> 1), 0));
|
|
||||||
listMarker_.push_back(QPoint((width() >> 1), height()));
|
|
||||||
listMarker_.push_back(QPoint(0, (height() >> 1)));
|
|
||||||
listMarker_.push_back(QPoint(width(), (height() >> 1)));
|
|
||||||
|
|
||||||
emit sizeChange(width(), height());
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::showEvent(QShowEvent *) {
|
|
||||||
isInit_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::hideEvent(QHideEvent *) {
|
|
||||||
currentRect_ = {};
|
|
||||||
movePos_ = {};
|
|
||||||
originPoint_ = {};
|
|
||||||
isInit_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::enterEvent(QEvent *e) {
|
|
||||||
setCursor(Qt::SizeAllCursor);
|
|
||||||
QWidget::enterEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::leaveEvent(QEvent *e) {
|
|
||||||
setCursor(Qt::ArrowCursor);
|
|
||||||
QWidget::leaveEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::closeEvent(QCloseEvent *)
|
|
||||||
{
|
|
||||||
isInit_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::paintEvent(QPaintEvent *) {
|
|
||||||
QPainter painter(this);
|
|
||||||
/// 绘制截屏编辑窗口
|
|
||||||
painter.drawPixmap(QPoint(0,0),
|
|
||||||
*originPainting_, currentRect_);
|
|
||||||
|
|
||||||
/// 绘制边框线
|
|
||||||
QPen pen(QColor(0,174,255),2);
|
|
||||||
painter.setPen(pen);
|
|
||||||
painter.drawRect(rect());
|
|
||||||
|
|
||||||
/// 绘制八个点
|
|
||||||
//改变点的宽度
|
|
||||||
pen.setWidth(4);
|
|
||||||
pen.setColor(Qt::red);
|
|
||||||
painter.setPen(pen);
|
|
||||||
painter.drawPoints(listMarker_);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QString OEScreen::getFileName(void) {
|
|
||||||
QString file_name = QDateTime::currentDateTime().toString("CSDN博客_瓯裔_yyyy-MM-dd-HH-mm-ss");
|
|
||||||
return file_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OEScreen::onSaveScreenOther(void) {
|
|
||||||
|
|
||||||
QString fileName = QFileDialog::getSaveFileName(this, "保存图片", getFileName(), "JPEG Files (*.jpg)");
|
|
||||||
if (fileName.length() > 0) {
|
|
||||||
originPainting_->copy(currentRect_).save(fileName, "jpg");
|
|
||||||
quitScreenshot();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::onSaveScreen(void) {
|
|
||||||
/// 把图片放入剪切板
|
|
||||||
QClipboard *board = QApplication::clipboard();
|
|
||||||
board->setPixmap(originPainting_->copy(currentRect_));
|
|
||||||
/// 退出当前截图工具
|
|
||||||
quitScreenshot();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OEScreen::quitScreenshot(void) {
|
|
||||||
close();
|
|
||||||
parentWidget()->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OEScreen::onMouseChange(int x, int y) {
|
|
||||||
show();
|
|
||||||
if (x < 0 || y < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const int& rx = (x >= originPoint_.x()) ? originPoint_.x() : x;
|
|
||||||
const int& ry = (y >= originPoint_.y()) ? originPoint_.y() : y;
|
|
||||||
const int& rw = abs(x - originPoint_.x());
|
|
||||||
const int& rh = abs(y - originPoint_.y());
|
|
||||||
|
|
||||||
/// 改变大小
|
|
||||||
currentRect_ = QRect(rx, ry, rw, rh);
|
|
||||||
|
|
||||||
this->setGeometry(currentRect_);
|
|
||||||
/// 改变大小后更新父窗口,防止父窗口未及时刷新而导致的问题
|
|
||||||
parentWidget()->update();
|
|
||||||
}
|
|
|
@ -1,508 +0,0 @@
|
||||||
/**
|
|
||||||
* @author : 陈鲁勇
|
|
||||||
* @date : 2017年04月
|
|
||||||
* @version: 1.0
|
|
||||||
* @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权;
|
|
||||||
* 除非遵守本许可,否则您不能使用这个文件。
|
|
||||||
* @remarks: 您可以获得该许可的副本:
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* 除非适用法律需要或者书面同意,按本许可分发的软件
|
|
||||||
* 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。
|
|
||||||
* 参见按照本许可控制许可权限及限制的特定语言的许可证。
|
|
||||||
*
|
|
||||||
* 你可以获得该代码的最新版本:
|
|
||||||
*
|
|
||||||
* https://git.oschina.net/Mr_ChenLuYong/screenshot
|
|
||||||
*
|
|
||||||
* 开源社区的所有人都期待与你的共同维护。
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习:
|
|
||||||
*
|
|
||||||
* 博客地址:http://blog.csdn.net/csnd_ayo
|
|
||||||
*
|
|
||||||
* 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915
|
|
||||||
*
|
|
||||||
* 期待你提交Bug,欢迎Issues。
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef OESCREENSHOT_H
|
|
||||||
#define OESCREENSHOT_H
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <QRect>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
class OEScreen;
|
|
||||||
class OERect;
|
|
||||||
class OEAmplifier;
|
|
||||||
class QTimer;
|
|
||||||
class QMenu;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @class : OEScreenshot
|
|
||||||
* @brief : 截屏功能的主要入口,
|
|
||||||
* 管理全局热键,资源的回收与释放.
|
|
||||||
* @remark: 调用示例( OEScreenshot::Instance(); )
|
|
||||||
*/
|
|
||||||
class OEScreenshot : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标移动(信号)
|
|
||||||
* @param : int x轴的坐标
|
|
||||||
* @param : int y轴的坐标
|
|
||||||
* @date : 2017年04月18日
|
|
||||||
*/
|
|
||||||
void cursorPosChange(int, int);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 双击(信号)
|
|
||||||
* @date : 2017年04月18日
|
|
||||||
*/
|
|
||||||
void doubleClick(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标当前位置最小的子窗口(信号)
|
|
||||||
* @param : QRect 当前窗口的矩形数据
|
|
||||||
* @date : 2017年04月18日
|
|
||||||
*/
|
|
||||||
void findChildWind(QRect);
|
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief : 构造函数
|
|
||||||
* @note : 当前依附的父窗口(一般不给父窗口)
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
explicit OEScreenshot(QWidget *parent = 0);
|
|
||||||
~OEScreenshot(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口实例
|
|
||||||
* @note : 通过这个函数获得截图器的整个实例
|
|
||||||
* @return: 返回 OEScreenshot 实例指针
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
*/
|
|
||||||
static OEScreenshot *Instance(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 摧毁截图窗口
|
|
||||||
* @note : 通过这个函数可以摧毁整个截图窗口
|
|
||||||
* @date : 2017年04月30日
|
|
||||||
*/
|
|
||||||
static void destroy(void);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 隐藏窗口事件
|
|
||||||
*/
|
|
||||||
virtual void hideEvent(QHideEvent *);
|
|
||||||
/**
|
|
||||||
* @brief : 关闭窗口事件
|
|
||||||
*/
|
|
||||||
virtual void closeEvent(QCloseEvent *);
|
|
||||||
/**
|
|
||||||
* @brief : 双击事件
|
|
||||||
*/
|
|
||||||
virtual void mouseDoubleClickEvent(QMouseEvent*);
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标按下事件
|
|
||||||
*/
|
|
||||||
virtual void mousePressEvent(QMouseEvent *);
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标释放事件
|
|
||||||
*/
|
|
||||||
virtual void mouseReleaseEvent(QMouseEvent *e);
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标移动事件
|
|
||||||
*/
|
|
||||||
virtual void mouseMoveEvent(QMouseEvent *e);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 按键按下事件
|
|
||||||
*/
|
|
||||||
virtual void keyPressEvent(QKeyEvent *e);
|
|
||||||
/**
|
|
||||||
* @brief : 自绘事件
|
|
||||||
*/
|
|
||||||
virtual void paintEvent(QPaintEvent *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 更新当前鼠标选区的窗口
|
|
||||||
*/
|
|
||||||
void updateMouse(void);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 初始化放大镜 (色彩采集器)
|
|
||||||
* @note : 他需要屏幕的原画作为放大器的放大元素
|
|
||||||
* @param : originPainting 放大器必要的元素,若为空,则默认用originPainting_原画
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
* @remark: 需先行调用getGlobalScreen。
|
|
||||||
*/
|
|
||||||
void initAmplifier(std::shared_ptr<QPixmap> originPainting = nullptr);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 测量控件 (大小感知器)
|
|
||||||
* @date : 2017年04月27日
|
|
||||||
*/
|
|
||||||
void initMeasureWidget(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 初始化截屏背景
|
|
||||||
* @return: QPixmap 经过暗色处理的屏幕图
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
*/
|
|
||||||
std::shared_ptr<QPixmap> initGlobalScreen(void);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 初始化鼠标
|
|
||||||
* @note : 为鼠标设置默认状态下的图标样式
|
|
||||||
* @param : ico 鼠标图片的资源文件路径
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
* @remark: 若参数未填写,在使用本程序默认的鼠标Logo
|
|
||||||
*/
|
|
||||||
void initCursor(const QString& ico = "");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 创建截图器
|
|
||||||
* @note : 若截图器已存在,则返回截图器示例,不会重复创建。
|
|
||||||
* @param : pos 截图器的起始位置 (给当前鼠标位置即可)
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
* @remark: 创建截图器前,需要创建相关的组件,(例:大小感知器,放大取色器)
|
|
||||||
*/
|
|
||||||
std::shared_ptr<OEScreen> createScreen(const QPoint &pos);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 摧毁截图器
|
|
||||||
* @note : 若截图器已存在,则摧毁示例,并清理示例创建的连带资源
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
void destroyScreen(void);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前屏幕的大小
|
|
||||||
* @note : 这个函数是支持多屏幕的,示例:双屏幕 QRect(-1920, 0, 3840, 1080)
|
|
||||||
* @return: 返回 QRect 引用
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
*/
|
|
||||||
const QRect& getScreenRect(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得屏幕的原画
|
|
||||||
* @note : 他不会重复获得屏幕原画,如果有,则返回原有的原画
|
|
||||||
* @return: QPixmap* 指针
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
* @remark: 若想重新获得屏幕原画,需要清理原有资源
|
|
||||||
*/
|
|
||||||
std::shared_ptr<QPixmap> getGlobalScreen(void);
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/// 截屏窗口是否已经展示
|
|
||||||
bool isLeftPressed_;
|
|
||||||
/// 用于检测误操作
|
|
||||||
QPoint startPoint_;
|
|
||||||
/// 当前桌面屏幕的矩形数据
|
|
||||||
QRect desktopRect_;
|
|
||||||
/// 屏幕暗色背景图
|
|
||||||
std::shared_ptr<QPixmap> backgroundScreen_;
|
|
||||||
/// 屏幕原画
|
|
||||||
std::shared_ptr<QPixmap> originPainting_;
|
|
||||||
/// 截图屏幕
|
|
||||||
std::shared_ptr<OEScreen> screenTool_;
|
|
||||||
/// 截图器大小感知器
|
|
||||||
std::shared_ptr<OERect> rectTool_;
|
|
||||||
/// 放大取色器
|
|
||||||
std::shared_ptr<OEAmplifier> amplifierTool_;
|
|
||||||
/// 当前鼠标选区最小的矩形窗口
|
|
||||||
QRect windowRect_;
|
|
||||||
/// 截屏实例对象
|
|
||||||
static OEScreenshot *self_;
|
|
||||||
/// 置顶定时器
|
|
||||||
QTimer* egoisticTimer_;
|
|
||||||
/// 活动窗口
|
|
||||||
static bool isActivity_;
|
|
||||||
private slots:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : Window下霸道置顶(唯我独尊)
|
|
||||||
* @date : 2017年04月28日
|
|
||||||
* @remark: 使用该函数时,会终止右键菜单的行为,慎重使用,避免BUG
|
|
||||||
*/
|
|
||||||
void onEgoistic(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @class : OERect
|
|
||||||
* @brief : 大小感知器
|
|
||||||
* @note : 主要关乎截图器左上方的大小感知控件
|
|
||||||
*/
|
|
||||||
class OERect : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
explicit OERect(QWidget *parent = 0);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 自绘函数
|
|
||||||
*/
|
|
||||||
void paintEvent(QPaintEvent *);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 外部组件位置修改(槽)
|
|
||||||
* @note : 感知器修改自身位置
|
|
||||||
* @param : x 横向位置
|
|
||||||
* @param : y 纵向位置
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
*/
|
|
||||||
void onPostionChange(int x, int y);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 外部组件大小修改 (槽)
|
|
||||||
* @note : 感知器修改显示的大小数据
|
|
||||||
* @param : w 宽度
|
|
||||||
* @param : h 高度
|
|
||||||
* @date : 2017年04月15日
|
|
||||||
*/
|
|
||||||
void onSizeChange(int w, int h);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// 背景色
|
|
||||||
std::shared_ptr<QPixmap> backgroundPixmap_;
|
|
||||||
/// 显示的文字信息
|
|
||||||
QString info_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @class : OEScreen
|
|
||||||
* @brief : 截图器
|
|
||||||
* @note : 主要关乎图片的编辑与保存
|
|
||||||
*/
|
|
||||||
class OEScreen : public QWidget {
|
|
||||||
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 截图器大小修改(信号)
|
|
||||||
* @param : int 宽度
|
|
||||||
* @param : int 高度
|
|
||||||
* @date : 2017年04月17日
|
|
||||||
*/
|
|
||||||
void sizeChange(int,int);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 截图器窗口的位置(信号)
|
|
||||||
* @param : int 窗口的横向位置
|
|
||||||
* @param : int 窗口的纵向位置
|
|
||||||
* @date : 2017年04月17日
|
|
||||||
*/
|
|
||||||
void postionChange(int,int);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 双击 (信号)
|
|
||||||
* @date : 2017年04月17日
|
|
||||||
*/
|
|
||||||
void doubleClick(void);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/// 内边距,决定拖拽的触发。
|
|
||||||
const int PADDING_ = 6;
|
|
||||||
|
|
||||||
/// 方位枚举
|
|
||||||
enum DIRECTION {
|
|
||||||
UPPER=0,
|
|
||||||
LOWER=1,
|
|
||||||
LEFT,
|
|
||||||
RIGHT,
|
|
||||||
LEFTUPPER,
|
|
||||||
LEFTLOWER,
|
|
||||||
RIGHTLOWER,
|
|
||||||
RIGHTUPPER,
|
|
||||||
NONE
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
explicit OEScreen(std::shared_ptr<QPixmap> originPainting, QPoint pos, QWidget *parent = 0);
|
|
||||||
|
|
||||||
~OEScreen() { isInit_ = false; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前截图器是否存在
|
|
||||||
* @return: true : 存在
|
|
||||||
* @date : 2017年04月17日
|
|
||||||
*/
|
|
||||||
static bool state(void) { return isInit_; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得当前坐标点的边界方位
|
|
||||||
* @param : cursor 当前鼠标的位置
|
|
||||||
* @return: DIRECTION 鼠标的方位枚举
|
|
||||||
* @date : 2017年04月17日
|
|
||||||
*/
|
|
||||||
DIRECTION getRegion(const QPoint &cursor);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 呼出菜单事件
|
|
||||||
*/
|
|
||||||
virtual void contextMenuEvent(QContextMenuEvent *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 双击事件
|
|
||||||
*/
|
|
||||||
virtual void mouseDoubleClickEvent(QMouseEvent *e);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标按下事件
|
|
||||||
*/
|
|
||||||
virtual void mousePressEvent(QMouseEvent *e);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标释放事件
|
|
||||||
*/
|
|
||||||
virtual void mouseReleaseEvent(QMouseEvent *e);
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标移动事件
|
|
||||||
*/
|
|
||||||
virtual void mouseMoveEvent(QMouseEvent *e);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口移动事件
|
|
||||||
*/
|
|
||||||
virtual void moveEvent(QMoveEvent *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口大小修改事件
|
|
||||||
*/
|
|
||||||
virtual void resizeEvent(QResizeEvent *);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口显示事件
|
|
||||||
*/
|
|
||||||
virtual void showEvent(QShowEvent *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口隐藏事件
|
|
||||||
*/
|
|
||||||
virtual void hideEvent(QHideEvent *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标进入窗口事件
|
|
||||||
*/
|
|
||||||
virtual void enterEvent(QEvent *e);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 鼠标离开窗口事件
|
|
||||||
*/
|
|
||||||
virtual void leaveEvent(QEvent *e);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 窗口关闭事件
|
|
||||||
*/
|
|
||||||
virtual void closeEvent(QCloseEvent *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 界面自绘事件
|
|
||||||
*/
|
|
||||||
virtual void paintEvent(QPaintEvent *);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 获得一个以时间格式命名的文件名
|
|
||||||
* @return: QString 文件名
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
virtual const QString getFileName(void);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 根据鼠标位置修改窗口大小
|
|
||||||
* @param : x 鼠标的横向位置
|
|
||||||
* @param : y 鼠标的纵向位置
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
void onMouseChange(int x,int y);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 保存屏幕到剪切板中
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
void onSaveScreen(void);
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 保存编辑屏幕到其他路径下
|
|
||||||
* @note : 会呼出路径选择的窗口
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
void onSaveScreenOther(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief : 退出当前截图窗口
|
|
||||||
* @date : 2017年04月16日
|
|
||||||
*/
|
|
||||||
void quitScreenshot(void);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/// 是否已经设置初始大小
|
|
||||||
static bool isInit_;
|
|
||||||
/// 窗口大小改变时,记录改变方向
|
|
||||||
DIRECTION direction_;
|
|
||||||
/// 起点
|
|
||||||
QPoint originPoint_;
|
|
||||||
/// 鼠标是否按下
|
|
||||||
bool isPressed_;
|
|
||||||
/// 拖动的距离
|
|
||||||
QPoint movePos_;
|
|
||||||
/// 标记锚点
|
|
||||||
QPolygon listMarker_;
|
|
||||||
/// 屏幕原画
|
|
||||||
std::shared_ptr<QPixmap> originPainting_;
|
|
||||||
/// 当前窗口几何数据 用于绘制截图区域
|
|
||||||
QRect currentRect_;
|
|
||||||
/// 右键菜单对象
|
|
||||||
QMenu *menu_;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /// OESCREENSHOT_H
|
|
Loading…
Reference in New Issue
Block a user