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

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

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

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


 

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

二、功能实现

  • 界面:

  • 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;
    }
    
    

     

全部评论

相关推荐

头像
10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务