QT自定义QLabel并用于显示图片

2023-11-10

一、概述

为了实现在Label上显示图片以及获取相应的坐标,需要相应的鼠标事件。然而,默认情况下,QLabel是不支持鼠标事件功能的,如点击事件。要实现QLabel的点击事件,一般有两种方式:一种是生成动态库文件将其放置到D:\ProgramFiles\Qt\5.12.10\msvc2015_64\plugins\designer目录下,即可在designer中直接拖动该控件,另一种则是直接添加控件类,并将相应的控件提升为自定义控件。

二、新建项目并添加mylabel类

在需要使用该自定义控件的项目下添加mylabel类。

在这里插入图片描述
mylibel类所在的头文件和cpp文件如下:
myLabel.h

#pragma once

#include <QWidget>
#include <QLabel>
#include <QObject>
#include <QEvent>
#include <QMouseEvent>

extern int xlocation;
extern int ylocation;
class mylabel : public QLabel
{
	Q_OBJECT    // must include this if you use Qt signals/slots
public:
	explicit mylabel(QWidget *parent = 0);

signals:
	void myClicked();                    // 单击产生的信号
	void myDoubleClicked();              // 双击产生的信号

private:
	void enterEvent(QEvent* event);      // 鼠标进入事件
	void leaveEvent(QEvent *event);      //当鼠离开
	void mousePressEvent(QMouseEvent* event);  //鼠标按下
	void mouseReleaseEvent(QMouseEvent *event);//鼠标释放
	void mouseMoveEvent(QMouseEvent *event);   //鼠标移动
	void mouseDoubleClickEvent(QMouseEvent *event); // 鼠标双击事件
};

mylabel.cpp

#include "myLabel.h"
#include <QDebug>
#include <QMoveEvent>
int xlocation = 0;
int ylocation = 0;
mylabel::mylabel(QWidget *parent) :QLabel(parent)
{

}
//鼠标进入
void mylabel::enterEvent(QEvent *event)
{
	qDebug() << "tips:" << "move enter";
	emit myDoubleClicked();
}
//鼠离开
void mylabel::leaveEvent(QEvent *event)
{
	qDebug() << "tips:" << "mouse leave";
	emit myDoubleClicked();
}
//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *event)
{
	QString  Str = QString("location: X=%1 Y=%2").arg(event->x()).arg(event->y());
	xlocation = event->x();
	ylocation = event->y();
	//判断鼠标是按下左键还是右键
	if (event->button() == Qt::LeftButton) {
		qDebug() << "tips:" << "mouse press the left button" + Str;
		emit myClicked();
	}
	else {
		qDebug() << "tips:" << "mouse press the right button" + Str;
	}
}
//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *event)
{
	//判断鼠标是按下左键还是右键
	if (event->button() == Qt::LeftButton) {
		qDebug() << "tips:" << "mouse release the left button";
	}
	else {
		qDebug() << "tips:" << "mouse release the right button";
	}
}
//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent *event)
{
	//持续状态 需要用buttons 用与操作符 进行判断
	if (event->buttons()&Qt::LeftButton) {
		QString  Str = QString("location:X=%1 Y=%2").arg(event->x()).arg(event->y());
		qDebug() << "tips:" << "mouse move" + Str;
	}
}
//当鼠标双击的时候
void mylabel::mouseDoubleClickEvent(QMouseEvent *event)
{
	qDebug() << "tips:" << "When the mouse double clicks, the double click signal is issued";
	emit myDoubleClicked();
}

三、提升Label控件

在qt designer的ui界面中,将Label控件拖至合适的位置,然后右击选择提升的窗口部件,将其提升为我们定义的mylabel类。
在这里插入图片描述

在这里插入图片描述

注意: 在将控件提升后,在我们的ui头文件中会自动包含我们定义的控件的头文件。从中可以看到,该头文件(myLabel.h)目录和ui_MyLabelTest2.h在同一目录下,因此需要将其复制到此目录下。

在这里插入图片描述

在这里插入图片描述

四、引用并连接信号

通过cnnect连接鼠标点击事件和执行函数,而鼠标按下事件(mousePressEvent)、鼠标移动事件等是protected属性的,因此不能通过信号槽直接连接。在此,我主要想通过鼠标按下事件获取label的坐标,因此使用了两个全局变量(xlocation和ylocation)来实现我的功能。
另外,还添加ImshowQImage()函数用以实现在Label控件上显示图像。

MyLabelTest2::MyLabelTest2(QWidget *parent)
    :QMainWindow(parent)
{
    ui.setupUi(this);
	//ui.label11->setText("hello word");
	ImshowQImage();
	QObject::connect(ui.label11, &mylabel::myClicked, this, &MyLabelTest2::myLabel_Clicked);
}
void MyLabelTest2::ImshowQImage()
{

	QString filename = "D:\\PyProject01\\images\\background.jpg";
	QImage image(filename);
	
	//图片自适应label大小
	image.scaled(ui.label11->size(), Qt::KeepAspectRatio);
	ui.label11->setScaledContents(true);
	//显示图片
	ui.label11->setPixmap(QPixmap::fromImage(image));
	//ui.label_processedImage->resize(ui.label_rawImage->pixmap()->size());
	ui.label11->show();
}
void MyLabelTest2::myLabel_Clicked()
{
	qDebug() << xlocation << " " << ylocation;
	ui.label2->setText(QString::asprintf("(%d,%d)", xlocation,ylocation));
}

五、效果测试

通过鼠标在Label上移动、按压、点击等操作来对我们的控件事件进行测试,测试结果如下:

在这里插入图片描述
最终的显示图片以及相应的坐标效果也得到实现。
在这里插入图片描述
壮哉,其乐无穷。如果觉得对您有帮助,就一键三连吧。

参考文献:
[1] https://blog.csdn.net/lizaijinsheng/article/details/125314092
[2] https://blog.csdn.net/qq_40541268/article/details/85211021
[3] https://blog.csdn.net/qq_33583069/article/details/109513284
[4] https://blog.csdn.net/augfun/article/details/101083946

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT自定义QLabel并用于显示图片 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐