1.头文件
#pragma once
#include <QtWidgets/QWidget>
#include "ui_WidgetTest4.h"
#include <QPaintEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QLabel>
#include <QToolBar>
class WidgetTest4 : public QWidget
{
Q_OBJECT
public:
WidgetTest4(QWidget *parent = Q_NULLPTR);
void paintEvent(QPaintEvent*); //绘图事件
void mouseMoveEvent(QMouseEvent*); //鼠标移动事件
void mousePressEvent(QMouseEvent*); //鼠标按下事件
void keyPressEvent(QKeyEvent*); //键盘按下事件
void mouseReleaseEvent(QMouseEvent*); //鼠标弹起事件
void init(); //初始化
void createToolBar(); //创建工具栏
void connectSlots(); //连接槽函数
private:
Ui::WidgetTest4Class ui;
QToolBar *m_pToolBar; //工具栏
QAction *m_pActSave; //保存
QAction *m_pActQuit; //退出
QAction* m_pFinish; //完成
QPoint m_ptFrist; //第一次按下坐标
QPoint m_ptEnd; //结束点坐标
bool m_bPress; //是否按下
QLabel* m_pLabel; //坐标值
private slots:
void saveFile(); //保存文件
void quit(); //退出
void finish(); //完成
};
2.源文件
#include "WidgetTest4.h"
#include <QPainter>
#include <QDesktopWidget>
#include <math.h>
#include <QScreen>
#include <QFileDialog>
#include <QWindow>
#include <QClipboard>
WidgetTest4::WidgetTest4(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
init();
createToolBar();
connectSlots();
//设置主程序界面图片(截取屏幕图片)
QString strPath = QCoreApplication::applicationDirPath();
QScreen* screen = QGuiApplication::primaryScreen();
screen->grabWindow(0).save(strPath + "/temp.bmp");
QPalette palette = this->palette();
QImage bkImage(strPath + "/temp.bmp");
QImage fillBkImage = bkImage.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
palette.setBrush(QPalette::Window, QBrush(fillBkImage));
this->setPalette(palette);
}
void WidgetTest4::connectSlots()
{
connect(m_pActSave, SIGNAL(triggered()), this, SLOT(saveFile()));
connect(m_pActQuit, SIGNAL(triggered()), this, SLOT(quit()));
connect(m_pFinish, SIGNAL(triggered()), this, SLOT(finish()));
}
void WidgetTest4::init()
{
m_bPress = false; //没有按下
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint); //设置窗体无标题栏
QDesktopWidget* pDesktopWidget = QApplication::desktop(); //获取当前桌面
//QRect deskRect = QApplication::desktop()->availableGeometry(); //获取可用桌面大小(不包含任务栏)
QRect screenRect = QApplication::desktop()->screenGeometry(); //获取主屏幕分辨率(包含任务栏)
resize(screenRect.width(), screenRect.height()); //设置窗体大小
//label的背景色和文字颜色
m_pLabel = new QLabel(this);
m_pLabel->setStyleSheet("QLabel {background-color: black;color:white;}");
}
void WidgetTest4::createToolBar()
{
//工具条
m_pToolBar = new QToolBar(this);
m_pActSave = new QAction(QStringLiteral("保存"));
m_pActQuit = new QAction(QStringLiteral("退出"));
m_pFinish = new QAction(QStringLiteral("完成"));
m_pToolBar->addAction(m_pActSave);
m_pToolBar->addAction(m_pActQuit);
m_pToolBar->addAction(m_pFinish);
m_pToolBar->setStyleSheet("QToolBar {background-color: white;color:black;}"); //设置工具栏样式表
m_pToolBar->setFixedSize(200, 40); //设置工具栏固定大小
m_pToolBar->hide();
}
void WidgetTest4::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
QPen pen(QColor(0, 0, 255));
painter.setPen(pen);
if (m_bPress == true)
{
//画矩形上的点
QBrush brush(QColor(0, 0, 255));
painter.setBrush(brush);
painter.drawRect(m_ptFrist.x()-2, m_ptFrist.y()-2, 5, 5);
painter.drawRect(m_ptFrist.x()+(m_ptEnd.x() - m_ptFrist.x())/2-2, m_ptFrist.y()-2, 5, 5);
painter.drawRect(m_ptEnd.x()-2, m_ptFrist.y()-2, 5, 5);
painter.drawRect(m_ptFrist.x()-2, m_ptFrist.y()+(m_ptEnd.y()-m_ptFrist.y())/2-2, 5, 5);
painter.drawRect(m_ptEnd.x()-2, m_ptFrist.y()+(m_ptEnd.y() - m_ptFrist.y()) / 2-2, 5, 5);
painter.drawRect(m_ptFrist.x()-2, m_ptEnd.y()-2, 5, 5);
painter.drawRect(m_ptFrist.x()+(m_ptEnd.x() - m_ptFrist.x()) / 2-2, m_ptEnd.y()-2, 5, 5);
painter.drawRect(m_ptEnd.x()-2, m_ptEnd.y()-2, 5, 5);
//画矩形
QBrush brush1(Qt::NoBrush);
painter.setBrush(brush1);
painter.drawRect(m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y()); //鼠标移动画矩形
painter.setClipRect(m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());
}
}
void WidgetTest4::mouseMoveEvent(QMouseEvent* event)
{
if (event->buttons() & Qt::LeftButton) //左键按下移动
{
m_ptEnd = event->pos();
int iWidth = m_ptEnd.x() - m_ptFrist.x(); //截取的宽度
int iHeight = m_ptEnd.y() - m_ptFrist.y(); //截取的高度
QString str = QString::number(abs(iWidth)) + "x" + QString::number(abs(iHeight));
m_pLabel->setText(str); //鼠标移动实时显示大小
m_pLabel->show();
update();
}
}
void WidgetTest4::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton) //左键按下
{
m_bPress = true;
m_ptFrist = event->pos(); //记录左键点击的坐标
if (m_ptFrist.x() < 80 || m_ptFrist.y() < 30)
{
m_pLabel->setGeometry(m_ptFrist.x(), m_ptFrist.y(), 80, 30); //设置label的位置及大小
}
else
{
m_pLabel->setGeometry(m_ptFrist.x(), m_ptFrist.y()-30, 80, 30); //设置label的位置及大小
}
}
}
void WidgetTest4::keyPressEvent(QKeyEvent* event)
{
if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_Q)) //组合键Ctrl+A
{
this->show();
//设置主程序界面图片(截取主屏幕图片)
QString strPath = QCoreApplication::applicationDirPath();
QScreen* screen = QGuiApplication::primaryScreen();
screen->grabWindow(0).save(strPath + "/temp.bmp");
QPalette palette = this->palette();
QImage bkImage(strPath + "/temp.bmp");
QImage fillBkImage = bkImage.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
palette.setBrush(QPalette::Window, QBrush(fillBkImage));
this->setPalette(palette);
}
else if (event->key() == Qt::Key_Escape) {
close(); //关闭窗口
}
}
void WidgetTest4::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_pToolBar->setGeometry(m_ptEnd.x()-200, m_ptEnd.y(), m_ptEnd.x(), 30); //设置工具栏在指定位置
m_pToolBar->show(); //显示工具栏
}
}
void WidgetTest4::saveFile()
{
QString strFile = QFileDialog::getSaveFileName(this, "save", "/1", "*.png;;*.jpg;;*.bmp"); //保存文件对话框
//截取制定位置的图片
QScreen *pScreen = QGuiApplication::primaryScreen();
QPixmap pixmap = pScreen->grabWindow(0, m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());
pixmap.save(strFile, "png"); //保存图片(格式:png,jpg,bmp)
}
void WidgetTest4::quit()
{
m_pLabel->hide(); //隐藏坐标
m_pToolBar->hide(); //隐藏工具栏
m_bPress = false; //鼠标弹起
update(); //更新界面
}
void WidgetTest4::finish()
{
//截取制定位置的图片
QScreen* pScreen = QGuiApplication::primaryScreen();
QPixmap pixmap = pScreen->grabWindow(0, m_ptFrist.x(), m_ptFrist.y(), m_ptEnd.x() - m_ptFrist.x(), m_ptEnd.y() - m_ptFrist.y());
QClipboard* pClipboard = QApplication::clipboard(); //获取系统剪贴板指针
pClipboard->setPixmap(pixmap); //复制到剪切板
close();
}