转自:https://blog.csdn.net/u011915578/article/details/46739069
这里采用的方法是按下截屏按钮截取整个桌面,然后通过鼠标的拖动选中截取的区域,
并把这个区域用截取的那张大图中相应的位置设置为QLabel背景,
实现了类似QQ的图片编辑功能,划线、矩形、画圆、文字编辑。
至于那个类似QQ的箭头功能暂时还没有实现,已经有了思路,后续补上。
好的,上代码:
class ScreenShot : public QWidget
{
Q_OBJECT
public:
static ScreenShot* Instance()
{
if (!instance)
instance = new ScreenShot();
return instance;
}
//ScreenShot();
void mouseMoveEvent(QMouseEvent *e); // 处理鼠标移动
void mousePressEvent(QMouseEvent *e); // 处理鼠标按下
void mouseReleaseEvent(QMouseEvent *e); // 处理鼠标释放
void paintEvent(QPaintEvent *e);
void setbackground(int width, int height); // 初始化程序背景
void grabScreen(); // 根据选取截屏,保存并打开图片
void setLabel(); // 动态显示截图区域尺寸
void setSelectImageLabel(QMouseEvent *e); // 用来显示选中图片
void keyPressEvent(QKeyEvent *e); // 处理esc取消按键
~ScreenShot();
//void show(); // 重写 show() 每次显示都重新渲染窗体背景 单例需要
void takeSnap();
public slots:
void onclickSaveAsBtn();
void onclickCancelBtn();
void onclickConfirmBtn();
void onClickDrawLineBtn();
void onClickRectangleBtn();
void onClickDrawRoundBtn();
void onClickTextEditBtn();
private:
//QRubberBand* g_rubber;
QPoint origin; // 记录鼠标按下坐标
QPoint end; // 记录鼠标释放坐标
QLabel* label; // 显示截图区域尺寸(x,y)
QSLabel* labelImage; // 用来显示选定区域的图片
QImage bg; // 记录全屏图片
QImage bg_gray; // 全屏灰色的图片
QRect rect; // 选中图片所在的矩形
int g_width; // 屏幕宽度
int g_height; // 屏幕高度
static ScreenShot* instance;
ScreenShot();
void closeAll(); //截图完成之后close按钮以及label
void setWindowNoState(); //截图完成后主窗口恢复
QPushButton *_cancelBtn, *_confirmBtn, *_saveAsBtn;//截好图之后显示,“取消”“确定”“另存为”三个按钮
QPushButton *_drawRoundBtn, *_drawLineBtn, *_rectangleBtn, *_textEditBtn, *_arrowBtn;
int finalWidth, finalHeight, finalX, finalY = 0;
QTimer *setBackgroundTime;
QRect deskRect;
};
具体的方法实现:
ScreenShot* ScreenShot::instance = 0;
ScreenShot::ScreenShot()
{
_saveAsBtn = new QPushButton(this);
_saveAsBtn->hide();
_saveAsBtn->setFixedSize(54, 32);
_saveAsBtn->setToolTip(qsl("保存为"));
_cancelBtn = new QPushButton(this);
_cancelBtn->hide();
_cancelBtn->setFixedSize(54, 32);
_cancelBtn->setToolTip(qsl("关闭"));
_confirmBtn = new QPushButton(this);
_confirmBtn->hide();
_confirmBtn->setFixedSize(54, 32);
_confirmBtn->setToolTip(qsl("确定"));
_drawLineBtn = new QPushButton(this);
_drawLineBtn->hide();
_drawLineBtn->setFixedSize(54, 32);
_drawLineBtn->setToolTip(qsl("划线"));
_drawRoundBtn = new QPushButton(this);
_drawRoundBtn->hide();
_drawRoundBtn->setFixedSize(54, 32);
_drawRoundBtn->setToolTip(qsl("圆"));
_rectangleBtn = new QPushButton(this);
_rectangleBtn->hide();
_rectangleBtn->setFixedSize(54, 32);
_rectangleBtn->setToolTip(qsl("矩形"));
_textEditBtn = new QPushButton(this);
_textEditBtn->hide();
_textEditBtn->setFixedSize(54, 32);
_textEditBtn->setToolTip(qsl("文字"));
_arrowBtn = new QPushButton(this);
_arrowBtn->hide();
_arrowBtn->setFixedSize(54, 32);
_arrowBtn->setToolTip(qsl("箭头"));
takeSnap();
//初始化变量
//g_rubber = NULL;
origin = end = QPoint(0, 0);
//截图标签
label = new QLabel("");
labelImage = new QSLabel(this);
Qt::WindowFlags nType = Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint;
//setWindowFlags(nType);
setWindowFlags(Qt::FramelessWindowHint);
label->setWindowFlags(nType);
labelImage->setWindowFlags(nType);
connect(_saveAsBtn, SIGNAL(clicked()), this, SLOT(onclickSaveAsBtn()));
connect(_cancelBtn, SIGNAL(clicked()), this, SLOT(onclickCancelBtn()));
connect(_confirmBtn, SIGNAL(clicked()), this, SLOT(onclickConfirmBtn()));
connect(labelImage, SIGNAL(onDoubleClick()), this, SLOT(onclickConfirmBtn()));
connect(_drawLineBtn, SIGNAL(clicked()), this, SLOT(onClickDrawLineBtn()));
connect(_drawRoundBtn, SIGNAL(clicked()), this, SLOT(onClickDrawRoundBtn()));
connect(_rectangleBtn, SIGNAL(clicked()), this, SLOT(onClickRectangleBtn()));
connect(_textEditBtn, SIGNAL(clicked()), this, SLOT(onClickTextEditBtn()));
connect(_arrowBtn, SIGNAL(clicked()), this, SLOT(onClickArrowBtn()));
}
ScreenShot::~ScreenShot()
{
}
void ScreenShot::mousePressEvent(QMouseEvent *e)
{
//if (!g_rubber)
{
//g_rubber = new QRubberBand(QRubberBand::Rectangle, this);
}
// 将橡皮框设置可见
//g_rubber->show();
// 记录点击位置
origin = e->pos();
// 设置橡皮框选区
//g_rubber->setGeometry(origin.x(), origin.y(), 0, 0);
}
void ScreenShot::mouseMoveEvent(QMouseEvent *e)
{
//if (g_rubber)
{
// 记录终点
end = e->pos();
//调整要显示的区域
int w = abs(end.x() - origin.x());
int h = abs(end.y() - origin.y());
int x = origin.x() < end.x() ? origin.x() : end.x();
int y = origin.y() < end.y() ? origin.y() : end.y();
//g_rubber->setGeometry(x, y, w, h);
//QImage selectImage = bg.copy(x, y, w, h);
// 动态显示选区大小及图片
setSelectImageLabel(e);
setLabel();
}
}
void ScreenShot::setSelectImageLabel(QMouseEvent *e)
{
int wid = abs(origin.x() - end.x());
int height = abs(origin.y() - end.y());
int x = origin.x() < end.x() ? origin.x() : end.x();
int y = origin.y() < end.y() ? origin.y() : end.y();
//设置标签显示内容e->globalPos() - dragPosition
//QImage selectImage = bg.copy(e->globalPos().x() - x, e->globalPos().y() - y, wid, height);
QImage selectImage = bg.copy(x, y, wid, height);
//QPixmap mp;
//mp = mp.fromImage(selectImage);
labelImage->setImageToLabel(selectImage);
//设置标签位置及大小
labelImage->setFixedSize(wid,height);
labelImage->move(QPoint(x, y));
labelImage->show();
}
void ScreenShot::mouseReleaseEvent(QMouseEvent *e)
{
//if (g_rubber)
{
// 记录终点
end = e->pos();
//g_rubber->hide();
// 截屏
//grabScreen();
// 截屏后关闭程序和标签栏
//label->close();
//labelImage->close();
// 如果使用close(),当主窗口隐藏时,主窗口也会close(),如果你需要将他作为一个模块,使用hide而不是close
//this->hide();
int wid = abs(origin.x() - end.x());
int height = abs(origin.y() - end.y());
int x = origin.x() < end.x() ? origin.x() : end.x();
int y = origin.y() < end.y() ? origin.y() : end.y();
finalWidth = wid;
finalHeight = height;
finalX = x;
finalY = y;
_arrowBtn->move(x + wid - 8 * 54, y + height);
_textEditBtn->move(x + wid - 7 * 54, y + height);
_drawRoundBtn->move(x + wid - 6 * 54, y + height);
_rectangleBtn->move(x + wid - 5 * 54, y + height);
_drawLineBtn->move(x + wid - 4 * 54, y + height);
_saveAsBtn->move(x + wid - 3 * 54, y + height);
_cancelBtn->move(x + wid - 2 * 54, y + height);
_confirmBtn->move(x + wid - 54, y + height);
_textEditBtn->show();
_arrowBtn->show();
_drawRoundBtn->show();
_rectangleBtn->show();
_drawLineBtn->show();
_saveAsBtn->show();
_cancelBtn->show();
_confirmBtn->show();
rect = QRect(x, y, wid, height);
}
}
void ScreenShot::grabScreen()
{
// 调整要截取的区域
int wid = abs(origin.x() - end.x());
int height = abs(origin.y() - end.y());
int x = origin.x() < end.x() ? origin.x() : end.x();
int y = origin.y() < end.y() ? origin.y() : end.y();
// 获取程序当前路径,打片截图
//QString path;
//QDir dir;
//char szPath[MAX_PATH] = { 0 };
//path = dir.currentPath();
//FileStore::Instance()->GetUserImageDir(szPath);
//path = QString::fromLocal8Bit(szPath);
//QString picName = QFileDialog::getSaveFileName(this, qsl("保存图片"), path, tr("Images(*.jpg *.png *.bmp)"));
}
void ScreenShot::setLabel()
{
// 调整标签显示位置
int wid = abs(origin.x() - end.x());
int height = abs(origin.y() - end.y());
int x = origin.x() < end.x() ? origin.x() : end.x();
int y = origin.y() < end.y() ? origin.y() : end.y();
// 设置标签显示内容
QString str = qsl(" %1 x %2 ").arg(wid).arg(height);
label->setText(str);
// 设置标签位置
QRect rect(label->contentsRect());
label->move(QPoint(x, y - rect.height()));
label->show();
}
void ScreenShot::keyPressEvent(QKeyEvent *e)
{
// 如果按下ESC键,关闭程序
if (e->key() == Qt::Key_Escape)
{
QFile::remove("bg.bmp");
label->close();
labelImage->close();
//if (g_rubber)
//g_rubber->close();
// 如果使用close(),当主窗口隐藏时,主窗口也会close(),如果你需要将他作为一个模块,使用hide而不是close
if (_cancelBtn)
{
_cancelBtn->hide();
_saveAsBtn->hide();
_drawLineBtn->hide();
_rectangleBtn->hide();
_textEditBtn->hide();
_arrowBtn->hide();
_drawRoundBtn->hide();
_confirmBtn->hide();
}
this->hide();
}
}
void ScreenShot::setbackground(int width, int height)
{
//截取当前屏幕
QScreen *screen = QGuiApplication::primaryScreen();
bg = screen->grabWindow(0).toImage();
//读取背景图,等比例缩放RGB值,使背景变暗,进入截图模式
int red, green, blue;
QImage bg_blend(width, height, QImage::Format_RGB32);
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
red = qRed(bg.pixel(x, y)) * 0.5;
green = qGreen(bg.pixel(x, y)) * 0.5;
blue = qBlue(bg.pixel(x, y)) * 0.5;
bg_blend.setPixel(x, y, qRgb(red, green, blue));
}
}
bg_gray = bg_blend;
// 将图片设置为背景
//QPalette palette;
//palette.setBrush(this->backgroundRole(), QBrush(bg_blend));
//this->setPalette(palette);
}
void ScreenShot::paintEvent(QPaintEvent *e)
{
QPainter p(this);
QPixmap pixmapToShow = QPixmap::fromImage(bg_gray.scaled(size(), Qt::IgnoreAspectRatio));
p.drawPixmap(0, 0, pixmapToShow);
//QPainter paint(labelImage);
}
void ScreenShot::onclickSaveAsBtn()
{
labelImage->show();
QString picName = QFileDialog::getSaveFileName(this, qsl("保存图片"), qsl("UC截图") + QDateTime::currentDateTime().toString("yyyyMMddhhmmss") + ".png", qsl("Images(*.jpg *.png *.bmp)"));
QImage pic = labelImage->resultImage();
pic.save(picName);
closeAll();
}
void ScreenShot::onclickCancelBtn()
{
closeAll();
1
}
void ScreenShot::onclickConfirmBtn()
{
//QImage pic = bg.copy(finalX, finalY, finalWidth, finalHeight);
//QPixmap pic = pic.fromImage(labelImage->pixmap);
QImage pic = labelImage->resultImage();
if (App::main()->getMessagesWidget()->isVisible())
{
App::main()->getMessagesWidget()->insertImageToInput(pic);
}
//把截取的图片放入系统剪切板
// QImage picture = bg.copy(finalX, finalY, finalWidth, finalHeight);
QMimeData *mimeData = new QMimeData();
mimeData->setImageData(pic);
QClipboard *clipBoard = QApplication::clipboard();
clipBoard->setMimeData(mimeData);
closeAll();
}
void ScreenShot::onClickDrawLineBtn()
{
labelImage->setDrawLineEnable();
1
}
void ScreenShot::onClickRectangleBtn()
{
labelImage->setRectangleEnable();
1
}
void ScreenShot::onClickTextEditBtn()
{
labelImage->setTextEditEnable();
1
}
void ScreenShot::onClickDrawRoundBtn()
{
labelImage->setRoundEnable();
1
}
void ScreenShot::setWindowNoState()
{
if (!(App::main()->getMessagesWidget()->isWindowShow()))
{
App::wnd()->setWindowState(Qt::WindowNoState);
}
}
void ScreenShot::closeAll()
{
QFile::remove("bg.bmp");
label->close();
labelImage->close();
//g_rubber->close();
_saveAsBtn->close();
_drawLineBtn->close();
_rectangleBtn->close();
_textEditBtn->close();
_arrowBtn->close();
_drawRoundBtn->close();
_cancelBtn->close();
_confirmBtn->close();
this->hide();
setWindowNoState();
}
void ScreenShot::takeSnap()
{
// 获取屏幕尺寸
QDesktopWidget* desktopWidget = QApplication::desktop();
deskRect = desktopWidget->screenGeometry();
// 将窗体设置为屏幕尺寸,去掉标题栏
g_width = deskRect.width();
g_height = deskRect.height();
this->resize(g_width, g_height);
// 调用setbackground() 设置背景
setbackground(deskRect.width(), deskRect.height());
}
定义自己的QLabel用来显示截取的区域,并在QLabel上面完成图片编辑的功能。
typedef struct myLine{
QPoint startPoint;
QPoint endPoint;
}myLine;//用来存放画的线
typedef struct myRectangle{
QPoint startPoint;
QPoint endPoint;
}myRectangle;//矩形
typedef struct myRound{
QPoint startPoint;
QPoint endPoint;
}myRound;//圆
typedef struct myText{
QString mText;
QRect mRect;
//QPoint mPoint;
}myText;//编辑的文字
class QSLabel :public QLabel
{
Q_OBJECT
public:
QSLabel(QWidget* parent);
void mouseDoubleClickEvent(QMouseEvent *e);//双击截取的图片完成截图
void mouseMoveEvent(QMouseEvent *e);//使label可以拖动
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void paintEvent(QPaintEvent *e);
void setImageToLabel(const QImage &);
void setDrawLineEnable();
void setRectangleEnable();
void setRoundEnable();
void setTextEditEnable();
void setTextEditToVector();
QImage resultImage();
public slots:
void onTextChanged();
signals:
void onDoubleClick();
private:
QPoint dragPosition;
QPoint startPoint;//起点
QPoint endPoint;//终点
bool isPressed;//鼠标是否按下
QVector<myLine*> lines;//存放所有线段
QVector<myRectangle*> rectangles;//存放所有矩形
QVector<myRound*> rounds;//存放所有圆形
QVector<myText*> texts;//存放所有文本
QString text;//要在图片上写的字
QImage selectImage;
QTextEdit *m_plainTextEdit;//编辑文字输入框
bool isDrawLine;
bool isDrawRectangle;
bool isDrawRound;
bool isTextEdit;
};
方法实现:
QSLabel::QSLabel(QWidget* parent)
{
setMouseTracking(true);
isPressed = false;
isDrawLine = false;
isDrawRectangle = false;
isDrawRound = false;
isTextEdit = false;
m_plainTextEdit = new QTextEdit(this);
m_plainTextEdit->hide();
m_plainTextEdit->resize(60, 40);
QPalette pl = m_plainTextEdit->palette();
pl.setBrush(QPalette::Base, QBrush(QColor(255, 0, 0, 0)));
m_plainTextEdit->setPalette(pl);//设置textedit背景透明
//m_plainTextEdit->setAttribute(Qt::WA_TranslucentBackground);
connect(m_plainTextEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
m_plainTextEdit->setStyleSheet(
"QTextEdit{ border: 1px solid #dadada; }"
"QTextEdit{font-family:'Microsoft YaHei'; font-size:14px;color:#ff0000;}"
""
);
}
void QSLabel::mouseDoubleClickEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
{
emit onDoubleClick();
}
}
void QSLabel::onTextChanged()
{
if (m_plainTextEdit->toPlainText().size() < 10)
{
m_plainTextEdit->resize(m_plainTextEdit->toPlainText().size() * 10 + 50, 40);
}
else
{
//m_plainTextEdit->resize(sqrt(m_plainTextEdit->toPlainText().size()) * 15 + 30, m_plainTextEdit->document()->size().rheight() + 10);
m_plainTextEdit->resize(m_plainTextEdit->toPlainText().size() * 15 + 20, m_plainTextEdit->document()->size().rheight() + 10);
}
//QTextDocument *document = qobject_cast<QTextDocument*>(sender());
//m_plainTextEdit->document()->adjustSize();
//if (m_plainTextEdit->document())
//{
// //m_plainTextEdit = qobject_cast<QTextEdit*>(m_plainTextEdit->document()->parent()->parent());
// if (m_plainTextEdit)
// {
// int newheight = m_plainTextEdit->document()->size().rheight() + 10;
// if (newheight != m_plainTextEdit->height())
// {
// m_plainTextEdit->setFixedHeight(newheight);
// }
// }
//}
}
void QSLabel::mouseMoveEvent(QMouseEvent *e)
{
if (isDrawLine || isDrawRectangle || isDrawRound || isTextEdit)
{
setCursor(Qt::CrossCursor);
}
if (isPressed)
{
if (isDrawLine)
{
endPoint = e->pos();
myLine *line = new myLine;//把新线段放入vector中
line->startPoint = startPoint;
line->endPoint = endPoint;
lines.push_back(line);
startPoint = endPoint;
}
else if (isDrawRectangle || isDrawRound)
{
endPoint = e->pos();
}
update();
}
}
void QSLabel::mousePressEvent(QMouseEvent *e)
{
startPoint = e->pos();
endPoint = e->pos();
isPressed = true;
if (isTextEdit)
{
if (m_plainTextEdit->toPlainText().size())
{
myText *text = new myText;//把文本放入vector中
//text->mPoint = QPoint(m_plainTextEdit->x(), m_plainTextEdit->y());
text->mRect = QRect(QPoint(m_plainTextEdit->x(), m_plainTextEdit->y()),QSize(m_plainTextEdit->width(), m_plainTextEdit->height()));
text->mText = m_plainTextEdit->toPlainText();
texts.push_back(text);
update();
}
m_plainTextEdit->move(startPoint);
m_plainTextEdit->show();
m_plainTextEdit->clear();
}
}
void QSLabel::mouseReleaseEvent(QMouseEvent *e)
{
//setCursor(Qt::ArrowCursor);
isPressed = false;
if (isDrawRectangle)
{
endPoint = e->pos();
myRectangle *rectangle = new myRectangle;//把新矩形放入vector中
rectangle->startPoint = startPoint;
rectangle->endPoint = endPoint;
rectangles.push_back(rectangle);
update();
}
else if (isDrawRound)
{
endPoint = e->pos();
myRound *round = new myRound;//把新圆形放入QVector中
round->startPoint = startPoint;
round->endPoint = endPoint;
rounds.push_back(round);
update();
}
}
void QSLabel::paintEvent(QPaintEvent *e)
{
QPainter p(this);
p.drawImage(0, 0, selectImage);
p.setRenderHint(QPainter::Antialiasing);
QPen pen;//创建画笔
pen.setColor(Qt::red);
pen.setWidth(2);
//QPainter painter(&selectImage);
p.setPen(pen);
p.setFont(st::addFriend->f);
for (int i = 0; i < lines.size(); i++)
{
myLine *line = lines[i];
p.drawLine(line->startPoint, line->endPoint);
}
for (int j = 0; j < rectangles.size(); j++)
{
myRectangle *rectangle = rectangles[j];
int x1 = rectangle->startPoint.x() < rectangle->endPoint.x() ? rectangle->startPoint.x() : rectangle->endPoint.x();
int y1 = rectangle->startPoint.y() < rectangle->endPoint.y() ? rectangle->startPoint.y() : rectangle->endPoint.y();
p.drawRect(x1, y1, abs(rectangle->endPoint.x() - rectangle->startPoint.x()), abs(rectangle->endPoint.y() - rectangle->startPoint.y()));
}
for (int k = 0; k < rounds.size(); k++)
{
myRound *round = rounds[k];
int x2 = round->startPoint.x() < round->endPoint.x() ? round->startPoint.x() : round->endPoint.x();
int y2 = round->startPoint.y() < round->endPoint.y() ? round->startPoint.y() : round->endPoint.y();
p.drawEllipse(x2, y2, abs(round->endPoint.x() - round->startPoint.x()), abs(round->endPoint.y() - round->startPoint.y()));
}
for (int l = 0; l < texts.size(); l++)
{
myText *text = texts[l];
QRect rect = text->mRect;
p.drawText(rect, Qt::TextWrapAnywhere, text->mText);//是绘制的文字在一个方框内TextWrapAnywhere切记
}
int xx = startPoint.x() < endPoint.x() ? startPoint.x() : endPoint.x();
int yy = startPoint.y() < endPoint.y() ? startPoint.y() : endPoint.y();
if (isDrawRectangle)
{
p.drawRect(xx, yy, abs(endPoint.x() - startPoint.x()), abs(endPoint.y() - startPoint.y()));
}
else if (isDrawRound)
{
p.drawEllipse(xx, yy, abs(endPoint.x() - startPoint.x()), abs(endPoint.y() - startPoint.y()));
}
QPoint points[4] = { QPoint(100, 100), QPoint(200, 100), QPoint(150, 200)};
p.drawPolygon(points, 3);
}
void QSLabel::setImageToLabel(const QImage &image)
{
selectImage = image;
lines.clear();
rectangles.clear();
rounds.clear();
texts.clear();
m_plainTextEdit->clear();
m_plainTextEdit->hide();
endPoint = QPoint(0, 0);
startPoint = QPoint(0, 0);
}
void QSLabel::setDrawLineEnable()
{
setTextEditToVector();
isDrawLine = true;
isDrawRectangle = false;
isDrawRound = false;
isTextEdit = false;
m_plainTextEdit->hide();
}
void QSLabel::setRectangleEnable()
{
setTextEditToVector();
isDrawLine = false;
isDrawRectangle = true;
isDrawRound = false;
isTextEdit = false;
m_plainTextEdit->hide();
}
void QSLabel::setRoundEnable()
{
setTextEditToVector();
isDrawLine = false;
isDrawRectangle = false;
isDrawRound = true;
isTextEdit = false;
m_plainTextEdit->hide();
}
void QSLabel::setTextEditEnable()
{
setTextEditToVector();
isDrawLine = false;
isDrawRectangle = false;
isDrawRound = false;
isTextEdit = true;
m_plainTextEdit->hide();
}
void QSLabel::setTextEditToVector()
{
if (isTextEdit&&m_plainTextEdit->toPlainText().size())
{
myText *text = new myText;//把文本放入vector中
text->mRect = QRect(QPoint(m_plainTextEdit->x(), m_plainTextEdit->y()), QSize(m_plainTextEdit->width(), m_plainTextEdit->height()));
text->mText = m_plainTextEdit->toPlainText();
texts.push_back(text);
update();
}
}
QImage QSLabel::resultImage()
{
return QImage(QPixmap::grabWidget(this).toImage());
1
}
/
下面是使用:
connect(btn,SIGNAL(clicked()),this,SLOT(onClickBtn()));
void onClickBtn()
{
ScreenShot* instance = ScreenShot::Instance();
instance->takeSnap();
instance->show();
1
}
全文完。