/** * @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 #include #ifndef QT_NO_DEBUG #include #endif #include "oecommonhelper.h" OEAmplifier::OEAmplifier(std::shared_ptr 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); }