VS+QT——QImage图片的点击选中与复制:从建工程开始
上一周做功能实现的时候,在其他博客上找到的都是图片的旋转、缩放等功能实现,一直找不到图片的点击选中与复制功能实现的博客,后来经过学习鼠标事件的重载自己实现了该功能,现做一个总结!!
附代码:https://download.csdn.net/download/qq_28662831/11212067
先来看看实现后的效果:两张图片可以点击选中,并点击复制按钮,即可使用ctrl+V复制到任意地方。
一、建立一个普通的GUI工程
- 工程的建立上篇文章已经写过了,《VS+QT——读写XML文件(含中文字符):从建工程开始》
二、功能实现
-
界面:
- 1. 随便放几个QLabel和一个按键,由于QLabel没有点击信号,所以我们自己重载该部件并定义信号与槽来实现需要的效果。
-
重载QLabel:
- 1. Qt Designer 界面编辑上,右键点击QLabel,选择提升为...,如下图所示输入,并点击添加,再选中提升的类,点击提升。
- 2. 回到工程,打开解决方案资源管理器:右键选中你的工程,点击添加->Add Qt Class。注意:这里的类名,需要和你刚才在界面上填写的一致。
- 这里基类为:QLabel。
- 3. 添加代码:
- //文件:MyLabel.h
-
//文件:MyLabel.h #pragma once #include <QLabel> #include <QMouseEvent> class MyLabel : public QLabel { Q_OBJECT public: MyLabel(QWidget *parent); ~MyLabel(); signals: void clicked(); //void release();//暂时用不上释放点击信号 protected: void mousePressEvent(QMouseEvent* ev); //void mouseReleaseEvent(QMouseEvent* ev); };
//文件:MyLabel.cpp #include "MyLabel.h" MyLabel::MyLabel(QWidget *parent) : QLabel(parent) { } MyLabel::~MyLabel() { } void MyLabel::mousePressEvent(QMouseEvent * ev) { Q_UNUSED(ev);//去掉warning emit clicked(); } /* void MyLabel::mouseReleaseEvent(QMouseEvent * ev) { Q_UNUSED(ev);//去掉warning emit release(); } */
到这里,我们就完成了QLabel控件的重载,上述代码也实现了鼠标点击事件的重载。因为是在我们重载的控件MyLabel里重载的事件,所有,只会当我们点击到MyLabel控件时,才会发射一个clicked()信号。
-
主窗口文件里要做的事儿:功能逻辑实现,直接上代码:
-
//文件:TestForSelectImage.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_TestForSelectImage.h" #include <QColor> #include <QFrame> #include <QEvent> #include <QMouseEvent> #include <QImage> #include <QPaintEvent> #include <QPainter> #include <QDir> #include <QClipboard> #include <QFileDialog> #include <QMessageBox> #include <QDebug> class TestForSelectImage : public QMainWindow { Q_OBJECT public: TestForSelectImage(QWidget *parent = Q_NULLPTR); QImage _image; private: Ui::TestForSelectImageClass ui; //槽函数 //槽函数 //槽函数 public slots: void copy_Button_Clicked(); //MyLabel自定义控件的槽函数 void on_MyLabel_clicked(); //成员函数 //成员函数 //成员函数 public: void GenerateImageAndShow(); //成员变量 //成员变量 //成员变量 private: QString *oldSelectLabelName = nullptr;//上一次选择的LabelName QString *newSelectLabelName = nullptr;//当前选择的LabelName };
//文件:TestForSelectImage.cpp #include "TestForSelectImage.h" TestForSelectImage::TestForSelectImage(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); ui.copyButton->setEnabled(false); oldSelectLabelName = new QString("");//上一次选择的LabelName newSelectLabelName = new QString("");//当前选择的LabelName //设置QLalel的阴影 ui.image0->setFrameShadow(QFrame::Raised);//Raised 上浮,Sunken 下降 connect(ui.image0, SIGNAL(clicked()), this, SLOT(on_MyLabel_clicked())); connect(ui.image1, SIGNAL(clicked()), this, SLOT(on_MyLabel_clicked())); connect(ui.copyButton, SIGNAL(clicked(bool)), this, SLOT(copy_Button_Clicked())); GenerateImageAndShow(); } //复制截图到剪切板 void TestForSelectImage::copy_Button_Clicked() { if (*oldSelectLabelName == "") { QMessageBox::warning(this, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("没有选择的图片!")); return; } int n = atoi((&((*oldSelectLabelName).toStdString())[((*oldSelectLabelName).size() - 1)])); qDebug() << "n = " << n; QPixmap pix; switch (n) { case 0: //控件截图并存放到clipboard pix = QPixmap::grabWidget(ui.image0); QApplication::clipboard()->setPixmap(pix); break; case 1: //控件截图并存放到clipboard pix = QPixmap::grabWidget(ui.image1); QApplication::clipboard()->setPixmap(pix); break; //若还有更多的图片,可以在这里添加。。。。 default: return; break; } } //MyLabel自定义控件的槽函数 void TestForSelectImage::on_MyLabel_clicked() { MyLabel *senderLabel = dynamic_cast<MyLabel*>(QObject::sender());//当前点击的Label *newSelectLabelName = senderLabel->objectName();//更新 if (*oldSelectLabelName == "")//第一次选择 { senderLabel->setStyleSheet("border:1px solid red;"); senderLabel->setFrameShadow(QFrame::Sunken);//Sunken 下降 *oldSelectLabelName = senderLabel->objectName();//更新 senderLabel = nullptr; ui.copyButton->setEnabled(true); return; } else//不是第一次选择 { if (*oldSelectLabelName == *newSelectLabelName)//再次点击同一个控件,即取消选择 { *oldSelectLabelName = ""; *newSelectLabelName = ""; //当前控件Label还原样式 senderLabel->setStyleSheet(""); senderLabel->setFrameShadow(QFrame::Raised);//Raised 上浮 senderLabel = nullptr; ui.copyButton->setEnabled(false); return; } else//点击一个新的控件 { //旧的控件 MyLabel *oldSelectLabel = ui.centralWidget->findChild<MyLabel *>(*oldSelectLabelName); oldSelectLabel->setStyleSheet(""); oldSelectLabel->setFrameShadow(QFrame::Raised);//Raised 上浮 oldSelectLabel = nullptr; //新的控件--信号发送者 senderLabel->setStyleSheet("border:1px solid red;"); senderLabel->setFrameShadow(QFrame::Sunken);//Sunken 下降 *oldSelectLabelName = senderLabel->objectName();//更新 senderLabel = nullptr; ui.copyButton->setEnabled(true); return; } } } void TestForSelectImage::GenerateImageAndShow() { QImage image0(240, 40, QImage::Format_RGB888); image0.fill(QColor(Qt::white).rgb()); ui.image0->setScaledContents(true); QSize resize0 = ui.image0->rect().size(); ui.image0->setPixmap(QPixmap::fromImage(image0).scaled(resize0)); QImage image1(240, 40, QImage::Format_RGB888); image1.fill(QColor(Qt::yellow).rgb()); ui.image1->setScaledContents(true); QSize resize1 = ui.image1->rect().size(); ui.image1->setPixmap(QPixmap::fromImage(image1).scaled(resize1)); return; }