qt实现QLabel上显示的文字有描边

2023-11-11

qt实现文字描边

效果图

此程序运行的效果。
在这里插入图片描述

开发环境

1.关于我的开发环境,我目前有点迷惑,我的QtCreator中帮助-》关于QtCreator,得到如下所示:
在这里插入图片描述
但是我的安装包上却写着5.12.9在这里插入图片描述
我的理解就是qt版本是5.12.9,但是QtCreator是基于Qt5.14.2的。不知道如此理解对否。
关于我的开发环境,我就是在上述QtCreator4.12.2上做的开发,且为debug模式下运行的程序,创建的项目是以QDialog为基类的应用程序。
2.项目的结构如下图所示:
在这里插入图片描述

项目示例

下面是所有的项目代码:
main.cpp

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include "fontoutlinelabel.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    Ui::Dialog *ui;
    FontOutLineLabel *m_label;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

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

    QFont fontUi;
    fontUi.setFamily("黑体");
    fontUi.setPixelSize(35);
    ui->label->setFont(fontUi);
    ui->label->setText("hudfhuhus会知道凤凰湖");
    int x = 50,y = 35;
    ui->label->setStartPos(x,y);
    ui->label->setFontOutLineColor(QColor(255,0,0));
    ui->label->setFontOutLineWidth(3);
    ui->label->setFontContentColor(QColor(Qt::blue));

    m_label = new FontOutLineLabel(this);
    m_label->setObjectName(QString::fromUtf8("labelCustom"));
    m_label->setText("hello world!!");
    QFont font;
    font.setFamily("Arial");
    font.setPixelSize(40);
    m_label->setFont(font);
    int a = 0, b = 40;//基准线坐标(x,y)
    m_label->setStartPos(a,b);
    m_label->setFontContentColor(QColor(Qt::gray));
    m_label->setFontOutLineWidth(3);
    m_label->setFontOutLineColor(QColor(78,45,23));
    m_label->setGeometry(QRect(10, 0, 450, 200));
}

Dialog::~Dialog()
{
    delete ui;
}

fontoutlinelabel.h

#ifndef FONTOUTLINELABEL_H
#define FONTOUTLINELABEL_H

#include <QObject>
#include <QLabel>

class FontOutLineLabel : public QLabel
{
    Q_OBJECT
public:
    FontOutLineLabel(QWidget *parent=nullptr);

    void setText(const QString& strText);//设置显示的文本
    void setFont(const QFont  &font);//设置文本字体
    void setStartPos(int &x,int &y);//设置字体开始写的起始点
    void setFontOutLineColor(const QColor & color);//设置字体轮廓线的颜色
    void setFontOutLineWidth(int wide = 1);//设置字体轮廓线的线宽
    void setFontContentColor(const QColor &color);//设置字体填充的颜色
protected:
    void paintEvent(QPaintEvent *) override;

private:
    QColor m_outLineColor;//字体轮廓线颜色
    QColor m_contentColor;//字体填充颜色
    int m_fontOutLineWidth;//字体轮廓线的线宽
    int m_y;//字体起始点的横坐标
    int m_x;//字体起始点的纵坐标
    QFont m_font;//字体
    QString m_text;//显示文本
};

#endif // FONTOUTLINELABEL_H

fontoutlinelabel.cpp

#include "fontoutlinelabel.h"
#include <QPainter>
#include <QStyleOption>

FontOutLineLabel::FontOutLineLabel(QWidget *parent)
    :QLabel(parent)
{
    m_outLineColor = QColor(60,179,113);
    m_contentColor = QColor(Qt::white);
    m_fontOutLineWidth = 2;
    m_y =  0;
    m_x = 0;
    m_font.setFamily("Arial");
    m_font.setPixelSize(35);
    m_text = QString("");
}

void FontOutLineLabel::setText(const QString &strText)
{
    m_text = strText;
}

void FontOutLineLabel::setFont(const QFont &font)
{
    m_font = font;
}

void FontOutLineLabel::setStartPos(int &x, int &y)
{
    m_x = x;
    m_y = y;
}

void FontOutLineLabel::setFontOutLineColor(const QColor &color)
{
    m_outLineColor = color;
}

void FontOutLineLabel::setFontOutLineWidth(int wide)
{
    m_fontOutLineWidth = wide;
}

void FontOutLineLabel::setFontContentColor(const QColor &color)
{
    m_contentColor = color;
}

void FontOutLineLabel::paintEvent(QPaintEvent *event)
{

    QPainter painter(this);
    QStyleOption opt;
    opt.initFrom(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);

    QPainterPath path;
    path.addText(m_x, m_y, m_font, m_text);

    QPen pen;
    pen.setColor(m_outLineColor);
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(m_fontOutLineWidth);

    painter.setRenderHint(QPainter::Antialiasing);
    painter.strokePath(path, pen);
    painter.fillPath(path, QBrush(m_contentColor));

    QWidget::paintEvent(event);
}

dialog.ui
其ui界面的整体布局如下图所示:
在这里插入图片描述

综述

整个工程中Dialog是对FontOutLineLabel类的应用,而FontOutLineLabel类是QLabel文字描边的实现类。main.cpp没有做任何的更改,Dialog类的构造函数中有两个FontOutLineLabel类对象,一个是通过ui界面拖拉控件QLabel后提升而来,一个是创建FontOutLineLabel类的指针从而只想该类的对象。
参考博文:
https://blog.csdn.net/piaoguo60/article/details/107174934
另外读者也可以参考博文:
https://blog.csdn.net/douzhq/article/details/104335491?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ETopBlog-1.topblog&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ETopBlog-1.topblog&utm_relevant_index=1

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

qt实现QLabel上显示的文字有描边 的相关文章

  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • QTableView 选择已更改

    我有一个QTableView我需要从中获取选择更改事件 我似乎无法让连接工作 我有 MyWidget h protected slots void slotLoadTransaction const QItemSelection selec
  • 关于在 Qt 中使用未记录的类

    使用无证文件是否安全QObjectUserData类和QObject setUserData in Qt 相反 你可以看看使用QObject setProperty http doc qt io qt 5 qobject html setP
  • 派生类在 PySide (Qt/PyQt) 中的错误线程中接收信号

    我在让派生类在 PySide 中正确接收信号时遇到问题 我在主 GUI 或命令行应用程序 线程的两个单独线程上使用发送器和接收器 线程是 QThread 对象 发送器和接收器在创建后立即使用 QObject moveToThread 移动到
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h
  • 我应该使用 QCoreApplication::processEvents() 还是 QApplication::processEvents()?

    我有一个从两者调用的方法QThreads和主线程 这个方法有时可能需要很长时间才能在循环中进行计算 所以我把QCoreApplication processEvents 这可以防止 GUI 冻结 在某个时刻我已经改变了QCoreApplic
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1

随机推荐

  • 类的设计方法

    1 类名首字母应该大写 字段 方法以及对象 句柄 的首字母应小写 对于所有标识符 其中包含的所有单词都应紧靠在一起 而且大写中间单词的首字母 例如 ThisIsAClassNamethisIsMethodOrFieldName若在定义中出现
  • vue中页面分页引导

    一 使用driver js做页面分页引导 default 先来看看默认引导的效果 可以根据自己的需求做页面样式上的修改 change 修改修改如下 移动端web端都可以用 接下来说一下具体的用法 1 npm 安装 npm install d
  • EsayExcel使用

    EsayExcel简单入门 1 maven依赖
  • 华为OD真题学习-查找单入口空闲区域 100

    回溯法 基本做法是搜索 通过x 1 x 1横向遍历 y 1 y 1纵向遍历 获取满足连通的坐标 原始参考链接 华为OD机试真题 python 查找单入口空闲区域 2022 Q4 100分 无痕de泪的博客 CSDN博客 查找单入口空闲区域
  • static变量可以被修改吗?

    静态变量并不是说其就不能改变值 不能改变值的量叫常量 其拥有的值是可变的 而且它会保持最新的值 说其静态 是因为它不会随着函数的调用和退出而发生变化 即上次调用函数的时候 如果我们给静态变量赋予某个值的话 下次函数调用时 这个值保持不变 静
  • Java Graphics2D绘制背景透明的图形过程

    package com jhy time import java awt AlphaComposite import java awt BasicStroke import java awt Color import java awt Gr
  • 关于COLA架构的讨论

    理解 分层 概念网上可以搜到很多 大体分为 adapter client app infra domain 这五层 图例这里有 就不贴了 adapter和app相当于spring里的controller service domain是领域模
  • 推荐引擎分为哪几类,个性化推荐引擎的介绍

    在信息时代的今天 大数据为用户获取方方面面的信息提高了效率 更可以智能的帮助用户从海量内容中快速找到想要阅读的信息 或者从海量商品中快速找到想要购买的商品 推荐引擎的发展让选择不明确的用户更加了解她们的需求和喜好 下面以内容产品和电商产品为
  • apk包加固后重新签名

    使用jarsigner对未签名的加固包进行签名 建议您使用之前对APP签名时使用的keystore对加固包进行签名 jarsigner digestalg SHA1 sigalg MD5withRSA verbose keystore yo
  • 动态代码块、静态代码块、静态方法、静态变量(属性 )、构造方法

    1 动态代码块 class Super int a 10 public void m1 System out println m1 动态代码块 System out println 动态代码块开始执行 System out println
  • imblearn 安装

    imblearn 安装 官网安装教程 踩坑经过 1 有些库版本达不到要求 imblearn需要依赖某些Python模块 下面是最新版0 7 0的依赖要求 python gt 3 6 numpy gt 1 13 3 scipy gt 0 19
  • smbms-AJAX验证旧密码实现

    优化密码修改使用ajax 主要是与前端接轨 1 阿里巴巴fastjson maven导入 导入包
  • matlab:txt数据文件的读出与读取

    输出数据 fid fopen hello txt w 需要改文件名称的地方 fprintf fid 10 3f n data data 需要导出的变量名称 10位有效数字 保留3位小数 包含小数点 f为双精度 g为科学计数法 fclose
  • 全志V3S开启启动

    一 TurnOffMute sh 创建自己需要的脚本 我这里创建关闭静音的脚本 vi TurnOffMute sh 然后往其中添加需要执行的命令 然后赋予可执行的权限 chmod 777 TurnOffMute sh 二 etc rc lo
  • 使用matlab对行人视频进行检测的代码的分析

    function F hogcalculator img cellpw cellph nblockw nblockh nthet overlap isglobalinterpolate issigned normmethod HOGCALC
  • linux定时清理文件的脚本

    1 新建清理文件脚本 vim autodelfile sh bin sh find 对应目录 mtime 天数 name 文件名 exec rm rf find linux的查找命令 用户查找指定条件的文件 home trans app f
  • 虚拟机的三种网络模式详解

    虚拟机的三种网络模式详解 1 桥接模式 此模式下 虚拟机的操作系统就像和物理机同一段网络中的物理机一样 它可以访问网络中的任何机器 同时只要物理机可以访问网络 虚拟机也可以实现上网 此模式是懒人模式首选 但换来一个问题就是 如果你的物理机网
  • PyCharm 新项目关联到码云(Gitee)源代码管理

    1 在 PyCharm 中创建新项目 打开 PyCharm 点击 Create New Project 或 File gt New Project 然后按照提示完成新项目的创建 2 在码云上创建新仓库 登录到你的码云账户 点击 新建仓库 输
  • Elasticsearch实战(七)---BestFields MostFields CrossFields 多字段搜索策略

    Elasticsearch实战 BestFields MostFields 搜索策略 文章目录 Elasticsearch实战 BestFields MostFields 搜索策略 1 字段中心及词条中心查询 2 Multi match q
  • qt实现QLabel上显示的文字有描边

    qt实现文字描边 效果图 开发环境 项目示例 综述 效果图 此程序运行的效果 开发环境 1 关于我的开发环境 我目前有点迷惑 我的QtCreator中帮助 关于QtCreator 得到如下所示 但是我的安装包上却写着5 12 9 我的理解就