欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS+QT——QImage图片的点击选中与复制:从建工程开始

程序员文章站 2024-03-04 15:06:41
...

上一周做功能实现的时候,在其他博客上找到的都是图片的旋转、缩放等功能实现,一直找不到图片的点击选中与复制功能实现的博客,后来经过学习鼠标事件的重载自己实现了该功能,现做一个总结!!

附代码:https://download.csdn.net/download/qq_28662831/11212067

先来看看实现后的效果:两张图片可以点击选中,并点击复制按钮,即可使用ctrl+V复制到任意地方。

VS+QT——QImage图片的点击选中与复制:从建工程开始


 

一、建立一个普通的GUI工程

二、功能实现

  • 界面:

  • 1.  随便放几个QLabel和一个按键,由于QLabel没有点击信号,所以我们自己重载该部件并定义信号与槽来实现需要的效果。
  • VS+QT——QImage图片的点击选中与复制:从建工程开始
  • 重载QLabel:

  • 1.  Qt  Designer 界面编辑上,右键点击QLabel,选择提升为...,如下图所示输入,并点击添加,再选中提升的类,点击提升。
  • VS+QT——QImage图片的点击选中与复制:从建工程开始VS+QT——QImage图片的点击选中与复制:从建工程开始
  • 2.  回到工程,打开解决方案资源管理器:右键选中你的工程,点击添加->Add Qt Class。注意:这里的类名,需要和你刚才在界面上填写的一致。
  • VS+QT——QImage图片的点击选中与复制:从建工程开始
  • VS+QT——QImage图片的点击选中与复制:从建工程开始
  • 这里基类为:QLabel。
  • VS+QT——QImage图片的点击选中与复制:从建工程开始
  • 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;
    }