上一篇QT截图程序,可多屏幕截图只是实现了最基本的截图功能,虽然能用但是缺点也有,没办法更改选中的区域,这在实际使用时不太方便。这篇增加了这个功能。先看看效果。
效果
实现代码为:
头文件
#ifndef MASKWIDGET_H
#define MASKWIDGET_H
#include <QWidget>
#include "mainwindow.h"
namespace Ui {
class MaskWidget;
}
enum SnapState{
NoSnap,
Snapped,
PreLeftDrag,
LeftDrag,
PreRightDrag,
RightDrag,
PreTopDrag,
TopDrag,
PreBottomDrag,
BottomDrag
};
class MaskWidget : public QWidget
{
Q_OBJECT
public:
explicit MaskWidget(QWidget *parent = nullptr);
~MaskWidget();
protected:
void mousePressEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
void paintEvent(QPaintEvent *event)override;
void keyPressEvent(QKeyEvent *event) override;
void showEvent(QShowEvent *event) override;
private slots:
void ResetSnap();
private:
QPoint m_pressPos;
QPoint m_newPos;
QRect m_maskRect{0, 0, 0, 0};
QPixmap m_image;
bool isPressed{false};
MainWindow m;
SnapState snapstate{NoSnap};
private:
Ui::MaskWidget *ui;
};
#endif // MASKWIDGET_H
源文件
#include "maskwidget.h"
#include "ui_maskwidget.h"
#include <QMouseEvent>
#include <QRegion>
#include <QScreen>
#include <QPainter>
#include <QGuiApplication>
#include <QPixmap>
#include <QDebug>
#include <QtMath>
#include <QCursor>
const int MINSIZE = 10;
MaskWidget::MaskWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MaskWidget)
{
ui->setupUi(this);
setMouseTracking(true);
setWindowFlags(Qt::FramelessWindowHint);
setWindowOpacity(0.8);
QList<QScreen*> screens = QGuiApplication::screens();
int width = 0;
int height = 0;
for (QScreen *screen : screens)
{
width += screen->geometry().width();
if (height < screen->geometry().height())
{
height = screen->geometry().height();
}
qDebug()<<screen->geometry();
}
this->setFixedSize(width, height);
m.hide();
connect(&m, SIGNAL(resetSnap()), this, SLOT(ResetSnap()));
}
MaskWidget::~MaskWidget()
{
delete ui;
}
void MaskWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
if (m_maskRect.width() == 0 && m_maskRect.width() == 0)
{
m_pressPos = event->pos();
this->setCursor(Qt::CrossCursor);
isPressed = true;
update();
}