Qt 自定义控件-支持换行和点击事件的Label

目录

    • 前言
    • 1、功能描述
    • 2、代码实现
      • 2.1 头文件
      • 2.2 源码文件
      • 2.3 设计思路
    • 3、示例
    • 4、总结

前言

本文主要介绍一个自定义控件,支持换行和点击事件的Label。起因是有这样一个需求,在一个复杂系统中有一个页面可以显示该系统中所有设备的名字,并且点击名字可以进入设备详情页。软件最初用QPushButton显示设备名字,但因为大部分设备的名字比较长,可显示的文字又太少,因此产品经理提出希望设备名称可以换行显示。于是有了本文介绍的这个自定义控件。

1、功能描述

QPushButton作为按钮,其基本功能是支持点击事件,支持设置按钮标题,支持设置按钮图标。参照QPushButton的基本功能,本自定义控件也实现了点击事件通知,设置图标,设置文本的功能,除此之外,本控件还支持设置是否换行。

2、代码实现

2.1 头文件

#ifndef ZCLICKABLELABEL_H
#define ZCLICKABLELABEL_H

#include <QLabel>
#include <QIcon>
#include <QHBoxLayout>

class  ZClickableLabel : public QWidget
{
    Q_OBJECT
public:
    explicit ZClickableLabel(QWidget *parent = NULL);

    /**
     * @brief setIcon 设置图标
     * @param icon  图标
     */
    void setIcon(const QIcon &icon);

    /**
     * @brief setText 设置文本
     * @param text  文本内容
     * @param wordWrap 是否换行
     */
    void setText(const QString &text, bool wordWrap = true);

    /**
     * @brief text 获取文本内容
     * @return
     */
    QString text() const;

signals:
    /**
     * @brief clicked 点击事件信号
     */
    void clicked();

protected:
    void mousePressEvent(QMouseEvent *ev) override;
private:
    QLabel *m_pIconLabel;
    QLabel *m_pTextLabel;
    QHBoxLayout *m_pHlayout;
};


#endif // ZCLICKABLELABEL_H

2.2 源码文件

#include <QPaintEvent>
#include <QPainter>

#include <QSpacerItem>
#include <QtDebug>

#include "zclickablelabel.h"

static const int iconWidth = 14;
static const int iconHeight = 14;

ZClickableLabel::ZClickableLabel(QWidget *parent)
    : QWidget(parent)
    , m_pIconLabel(NULL)
    , m_pTextLabel(NULL)
    , m_pHlayout(NULL)
{
    setObjectName("ZClickableLabel");
    m_pTextLabel = new QLabel(this);
    m_pTextLabel->setAlignment(Qt::AlignTop|Qt::AlignLeft);
    m_pHlayout = new QHBoxLayout;
    m_pHlayout->addWidget(m_pTextLabel);
    setLayout(m_pHlayout);
}

void ZClickableLabel::setIcon(const QIcon &icon)
{
    if(!m_pIconLabel)
    {
        m_pIconLabel = new QLabel(this);
    }
    m_pIconLabel->setPixmap(icon.pixmap(iconWidth,iconHeight));
    m_pIconLabel->setMaximumWidth(iconWidth);
    m_pIconLabel->setMaximumHeight(iconHeight);
    m_pIconLabel->setAlignment(Qt::AlignTop);
    m_pHlayout->insertWidget(0, m_pIconLabel);
}

void ZClickableLabel::setText(const QString &text, bool wordWrap)
{
    m_pTextLabel->setWordWrap(wordWrap);
    QFontMetrics fm(m_pTextLabel->font());
    int labelWidth = m_pTextLabel->rect().width();
    if(fm.width(text) > labelWidth)
    {
        double lines = m_pTextLabel->rect().height() / fm.height();
        m_pTextLabel->setText(fm.elidedText(text, Qt::ElideRight, labelWidth * lines, Qt::TextWordWrap));
    }
    else
    {
        m_pTextLabel->setText(text);
    }
}

QString ZClickableLabel::text() const
{
    return m_pTextLabel->text();
}

void ZClickableLabel::mousePressEvent(QMouseEvent *ev)
{
    Q_UNUSED(ev)
    emit clicked();
}

2.3 设计思路

该控件继承自QWidget,在QWidget内部有两个QLabel组件和一个水平布局控件,其中m_pIconLabel为图标显示控件,m_pTextLabel为文本内容显示控件。通过重载void mousePressEvent(QMouseEvent *ev)函数,本控件实现了点击事件的获取,并将点击事件通过信号 clicked() 抛给外界使用者。
为了当文本过长显示不下时在末尾显示省略号,在setText函数中,根据控件尺寸动态计算带省略号的文本长度,代码如下:

	QFontMetrics fm(m_pTextLabel->font());
    int labelWidth = m_pTextLabel->rect().width();
    if(fm.width(text) > labelWidth)
    {
        double lines = m_pTextLabel->rect().height() / fm.height();
        m_pTextLabel->setText(fm.elidedText(text, Qt::ElideRight, labelWidth * lines, Qt::TextWordWrap));
    }
    else
    {
        m_pTextLabel->setText(text);
    }

如果用户设置了icon,就把m_pIconLabel 添加到控件布局m_pHlayout 上,否则不添加。这一点是在函数setIcon中实现的。

	m_pIconLabel->setPixmap(icon.pixmap(iconWidth,iconHeight));
    m_pIconLabel->setMaximumWidth(iconWidth);
    m_pIconLabel->setMaximumHeight(iconHeight);
    m_pIconLabel->setAlignment(Qt::AlignTop);
    m_pHlayout->insertWidget(0, m_pIconLabel);

3、示例

将ZClickableLabel的头文件和源码文件复制到工程目录下,并添加到测试工程中,然后在MainWindow.ui文件中添加测试控件,并将click_lb1和click_lb2两个QWidget提升为ZClickableLabel,如下图所示:
在这里插入图片描述
在MainWindow.cpp中实现测试代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
      , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    ui->click_lb1->setText("白日依山尽,");
    ui->click_lb2->setText("黄河入海流!");

    ui->click_lb1->setIcon(QIcon(":/resources/icon_redTip.png"));
    ui->click_lb2->setIcon(QIcon(":/resources/icon_tip.png"));

    connect(ui->click_lb1, SIGNAL(clicked()), this, SLOT(slot_labelClicked()));
    connect(ui->click_lb2, SIGNAL(clicked()), this, SLOT(slot_labelClicked()));
}

void MainWindow::slot_labelClicked()
{
    ZClickableLabel *pLabel = qobject_cast<ZClickableLabel*>(sender());
    if(pLabel)
    {
        QMessageBox::information(this, "提示", pLabel->text());
    }
}

编译运行程序,查看效果

在这里插入图片描述

点击自定义控件弹出对话框:
在这里插入图片描述

4、总结

这种自定义控件不难,你学会了吗?以上就是本文的所有内容了,欢迎留言讨论,下一篇再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124419.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】Redis整合SSMRedis注解式缓存Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

目录&#xff1a; 目录 一&#xff0c;SSM整合redis 二&#xff0c;redis注解式缓存 三&#xff0c;Redis中的缓存穿透、雪崩、击穿的原因以及解决方案&#xff08;附图&#xff09; 一&#xff0c;SSM整合redis 1.原因&#xff1a; 整合SSM和Redis可以提升系统的性能、可…

骑士巡游问题

一、骑士巡游问题 题目描述&#xff1a;骑士在8*8的国际象棋棋盘上进行巡游&#xff0c;当指定骑士出发的位置后&#xff08;x,y&#xff09;&#xff0c;能输出骑士遍历棋盘的所有路径坐标。 输出效果&#xff1a; 代码&#xff08;请在visual stdio下运行&#xff0c;Dev-C…

腾讯蒋杰:坚持用技术服务应用,腾讯混元大模型已接入180多个业务

“腾讯正在持续探索大模型应用场景&#xff0c;目前内部超180项业务已经接入腾讯混元大模型进行内测”&#xff0c;11月9日&#xff0c;腾讯集团副总裁蒋杰在2023年世界互联网大会乌镇峰会上表示。 腾讯集团副总裁 蒋杰 作为腾讯全链路自研的实用级大模型&#xff0c;自2023年…

MySQL(12):MySQL数据类型

MySQL中的数据类型 常见数据类型的属性&#xff1a; 整数类型 整数类型一共有 5 种&#xff0c;包括 TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INTEGER&#xff09;和 BIGINT。 CREATE TABLE test_int1 ( X TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );…

在linux上脱离hadoop安装hbase-2.5.6集群

一、软件版本 1.1、jdk1.8 1.2、hbase 2.5.6 1.3、zookeeper 3.8.1 二、计算节点 准备三台服务器 192.168.42.139 node1 192.168.42.140 node2 192.168.42.141 node3三、配置环境 1、每台服务器都配置jdk环境变量 [rootnode1 data]# javac -version javac 1.8.0_3912、每…

《童年》 思维导图

《童年》是高尔基自传体小说三部曲中的第一部&#xff0c;讲述的是高尔基幼年丧父、母亲改嫁&#xff0c;他跟随日渐破落的小染坊主外公以及外婆生活的童年经历。小说通过一个儿童天真无邪的眼光&#xff0c;向读者生动地展示了19世纪中叶俄罗斯社会底层人民的生活状态&#xf…

【c趣编程】输入一个整数,判断其有几位

目录 1题目要求&#xff1a; 2解题思路&#xff1a; 3代码如下所示&#xff1a; 4运行代码如下&#xff1a; 5总结&#xff1a; 1题目要求&#xff1a; 只用一个scanf输出一串数&#xff0c;不可以一个一个的输入并计数&#xff0c;那样太浪费时间了。 C语言是一门面向过…

cortex-A7核 中断实验(按键中断实验)

1.选择按键触发方式 下降沿 2.解决消抖的方法 1&#xff09;ARM中&#xff1a;延时消抖 2&#xff09;linux驱动开发&#xff1a;定时器函数 3.框图 内部流程框图&#xff1a; 需要RCC GPIO EXTI GIC章节 中断触发流程&#xff1a; 4.RCC 章节 1&#xff09;使能GPIOF组 …

使用IDEA让文本对比不在变的困难

文章目录 前言操作1、IDEA与电脑磁盘任意文件的比较2、项目内部的文件比较3、剪切板比较4、IDEA本地历史比较5、IDEA版本历史对比 前言 在日常实际开发当中我们常常会对一些代码或内容进行比对查看是否有差异&#xff0c;这个时候不需要借用第三方比对插件&#xff0c;在IDEA中…

HackTheBox-Starting Point--Tier 2---Base

文章目录 一 题目二 过程记录2.1 打点2.2 权限获取2.3 横向移动2.4 权限提升 一 题目 Tags Web、Vulnerability Assessment、Custom Applications、Source Code Analysis、Authentication、Apache、PHP、Reconnaissance、Web Site Structure Discovery、SUDO Exploitation、Au…

无需开发,精臣云可轻松连接用户运营、广告推广等行业应用

精臣智慧标识科技有限公司简介 武汉精臣智慧标识科技有限公司&#xff0c;是国内便携式标签打印机创新品牌和实物管理解决方案服务商。在物品标签还处在繁琐的PC打印时代&#xff0c;精臣公司便创造性地从智能便携角度出发&#xff0c;顺应移动互联时代趋势&#xff0c;推出了…

汽车生产RFID智能制造设计解决方案与思路

汽车行业需求 汽车行业正面临着快速变革&#xff0c;传统的汽车制造方式正在向柔性化、数字化、自动化和数据化的智能制造体系转变&#xff0c;在这个变革的背景下&#xff0c;汽车制造企业面临着物流、生产、配送和资产管理等方面的挑战&#xff0c;为了应对这些挑战&#xf…

某XX自考小程序的AES加密分析

前言 主要是报了自考在这个小程序上面做题&#xff0c;就研究了一下这个接口本文仅供学习交流使用&#xff0c;请勿随意传播。如有侵犯你的权益及时联系我删除。 一、抓包分析打开小程序&#xff0c;打开devtools 工具&#xff0c;这里就不啰嗦&#xff0c;直接上过程。 点击…

第一次pta认证P测试C++

第一题 试题编号&#xff1a;20210701-1 试题名称&#xff1a;标题统计 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 128.0MB 【问题描述】 小明阅读了一篇特别优美的英文文章&#xff0c;读到最后总结段落的时候&#xff0c;突发奇 想&#xff0c;想要数一数这个段落中…

找不到模块“./App.vue”或其相应的类型声明。ts(2307)

先看报错信息&#xff1a; 这是我们初始创建是就自带的&#xff0c;怎么会错误呢&#xff0c;实际上是因为未定义 .vue文件的类型&#xff0c;导致 ts 无法解析其类型&#xff0c;在env.d.ts中定义后即可解决。 对于我们初学者来说&#xff0c;刚刚按照视频来创建的项目怎么啥…

柯桥英语培训,商务英语学习,常用口语

欢迎各位小伙伴来到 ——“每个单词我都认识&#xff0c;但我又不认识整个短语”的时候啦&#xff01; “dog”是“狗” “breakfast”是早餐 那“a dogs breakfast”是“狗的早餐”&#xff1f; 狗听了都摇头。 a dogs breakfast是一句英文俚语&#xff0c;指的是无序、混…

岩土工程公路隧道监测中智能振弦传感器的应用方案

岩土工程公路隧道监测中智能振弦传感器的应用方案 隧道建设是现代城市发展中不可或缺的一部分。但隧道工程建设与维护过程中需要考虑诸多风险。地质环境复杂&#xff0c;地下水位、地震等因素可能导致隧道构造物的沉降、变形等问题。为此&#xff0c;在隧道建设和运营过程中&a…

RabbitMQ 系列教程

一、RabbitMQ 部署及配置详解(集群部署) 二、RabbitMQ 部署及配置详解 (单机) 三、RabbitMQ 详解及实例&#xff08;含错误信息处理&#xff09; 四、RabbitMq死信队列及其处理方案 五、RabbitMQ Java开发教程—官方原版 六、RabbitMQ Java开发教程&#xff08;二&#x…

视频编软件会声会影2024中文版功能介绍

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能&#xff0c;用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材&#xff0c;让用户剪辑视频更加的轻松。 会…

FPGA配置采集AR0135工业相机,提供2套工程源码和技术支持

目录 1、前言免责声明 2、AR0135工业相机简介3、我这里已有的 FPGA 图像处理解决方案4、设计思路框架AR0135配置和采集图像缓存视频输出 5、vivado工程1–>Kintex7开发板工程6、vivado工程1–>Zynq7100开发板工程7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前…