【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件

Qt实现自定义控件能够以插件的方式加载到Qt设计师 在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师知道他们的存在。常规方法有俩种改进法和插件法。 阅读详情

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件

往期回顾

【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss-优快云博客

【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-优快云博客

【QT入门】Qt自定义控件与样式设计之qss的加载方式-优快云博客

一、最终效果

通过提升QPushButton控件,并在提升后自定义其设计,我们就实现了图片+文字的按钮效果

二、什么是控件提升

控件提升相当于把控件编成另一个控件,或者说称为自定义控件,控件提升需要在Qt设计器里操作

因为所有的ui类其实都是继承于QWidget,也就意味着都可以看作是一个窗口,都可以进行设计,自定义控件的时候,注意找好其继承哪个类。

这个是一个很常见且常用的方法,因为实际开发的时候往往qt自带的控件是没法满足我们的需求的,此时基本都是需要我们去进行控件提升从而自定义控件来完成各种各样的设计。

三、示例实现

正如上面最终效果所示,我要在一个QPushButton里实现上面是图片,下面是文字的效果,其实用ToolButton是可以直接实现的,那我们就用QPushButton怎么做?

1、ui设计

第一个,可以在ui设计里,直接在QPushButton上下放两个label,一个放图片一个文字就实现了。

我们一直在强调,ui里所有控件的最终父控件都是Qwidget,也就是说,我们对于每一个控件其实都可以当作是一个widget进行设计。

2、提升控件后自定义

第二种方法就是,提升控件,去进行自定义,这样我们就可以自己写样式。

一定要理解提升控件并自定义的作用,就相当于是我们可以把任意控件提升为我们自定义的一个类,这样就可以把该控件当作一个全新的widget来用代码布局。

2.1、在ui界面提升控件

先在ui界面把QPushButton提升为CMyButton类,然后创建C++的类,名字就是CMyButton,继承自QPushButton类和QOBJEC类

新建CMyButton类 

class CMyButton : public QPushButton
{
    Q_OBJECT

public:
    CMyButton(QWidget *parent);

};
CMyButton::CMyButton(QWidget * parent)
    :QPushButton(parent)
{

}
2.2、在CMyButton类里做相应的代码设计 

注意类初始化的继承写法

要记得设置margins值为0,因为默认为1会有间隙

 CMyButton.h

class CMyButton : public QPushButton
{
    Q_OBJECT

public:
    CMyButton(QWidget *parent);

    //自定义两个方法,分别用来放文件名和文字,注意跟qt自带的方法区分开
    void set_Icon(const QString& fileName);
    void set_Text(const QString& text);

private:
    //定义两个QLabel,一个放图片一个放文字
    QLabel *m_pIconLabel;
    QLabel *m_pTextLabel;
};

  CMyButton.cpp

CMyButton::CMyButton(QWidget * parent)
    :QPushButton(parent)
{
    //设置按钮大小
    this->setFixedSize(64, 88);
    this->setText("");
    
    //上面的label设置大小放图片
    m_pIconLabel = new QLabel(this);
    m_pIconLabel->setFixedSize(64, 64);
    m_pIconLabel->setPixmap(QPixmap(":/resources/save.png"));
    
    //下面的label设置大小放文字
    m_pTextLabel = new QLabel(this);
    m_pTextLabel->setFixedSize(64, 24);
    m_pTextLabel->setText(u8"保存");
    
    //创建垂直布局放进去,设置margin为0
    //这一步比较关键,因为默认margin为11,不设置的话,就会有边框
    QVBoxLayout* pVlay = new QVBoxLayout(this);
    pVlay->addWidget(m_pIconLabel);
    //pVlay->addSpacing(5);
    pVlay->addWidget(m_pTextLabel);
    pVlay->setContentsMargins(0,0,0,0);
}

//实现两个自定义方法
void CMyButton::set_Icon(const QString& fileName)
{

}
void CMyButton::set_Text(const QString& text)
{
    m_pTextLabel->setText(text);
}

这样我们就实现了控件提升和自定义控件,用QPushButton设计出我们想要的图片+文字效果 

3、由于自定义控件的独立性,我们可以在旁边再放一个按钮用来进行信号槽连接 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->pushButton->setText("");
    ui->pushButton->setFixedSize(64, 88);
    
    //旁边再放一个按钮实现信号槽连接
    //这里就用到了自定义的方法
    connect(ui->pushButton_2, &QPushButton::released, [=]{
        ui->pushButton->set_Text("保存");
     });

    connect(ui->pushButton_2, &QPushButton::pressed,[=]{
        ui->pushButton->set_Text("不保存");
    });
}

以上就是控件提升与自定义控件基本示例。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

Qt4设计自定义LED灯控件(提升法) 1.创建QtGui工程 2.设计自定义控件(设计控件外形,行为) myled.h #ifndef MYLED_H #define MYLED_H #include  class MyLed : public QWidget {     Q_OBJECT public:     explicit MyLed(QWidget *parent = 0); 阅读详情

相关推荐

Qt自定义控件以及控件的提升

关于在使用Qt做界面时,通用、常用的控件重复设置属性是件麻烦的事情,比如密码输入框,一个密码输入框要设置许多属性,比如密文显示,长度,只能输入固定字符类型,禁止复制等等,一个项目里面有时会用到很多密码框,每设置一个密码框就会导致对上面的属性重复设置,会导致效率低下,最终规范还不统一等问题。自定义一个控件,继承自QLineEdit类,如下代码: 控件头文件PasswordLineEdit.h#ifn

未来之歌 2万+

QT自定义控件

QT的UI设计器提供了很多GUI设计的界面组件,可以满足常见的界面设计需求。但是某些时候需要设计特殊的界面组件,而在UI设计器的组件面板里根本没有合适的组件,这时就需要设计自定义的界面组件。在widget界面上放置一个Widget组件,右击Widget,点击提升为提升的类的名称就是刚才添加的那个类Custom点击添加,然后点击提升运行程序后,可以看到,在Widget主窗口中就会出现我们自定义的控件我们想要的效果是拉动进度条,数字同步发生变化。

new9232的博客 4343

Qt编写自定义控件及插件的使用

  在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等。虽然Qt Designer里的控件可以满足我们大部分的需求,但是有时候,也会产生一些特殊的需要,比如一个输入框,我们要输入的是经纬度,此时就会有两种输入方式,一种是小数形式,一种是度分秒的形式,此时只使用一个简单的LineEdit是无...

2548

Qt--自定义控件

这里以 SpinBox和HorizontalSlider 组合的自定义控件为例,介绍常规的自定义控件的开发步骤。假设这里有一个Widget项目,作为工作项目。右键项目 -》添加新文件, 选择Qt -》Qt设计器界面类:选择自定义控件的父类:输入自定义控件类的名称:最后会给出添加的文件:添加完成后可以看到.pro文件中自动添加了自定义类的.h .cpp以及ui文件,另外在界面文件中,也多了一个smallwidget.ui文件:然后就可以在smallwidget.ui文件中设计我们的自定义控件了。

SNAKEpc12138的博客 7421

解决 Qt 中提升控件后样式表无法正确应用的问题

paintEvent。

吃面不喝汤的博客 1266

在QT中进行控件提升操作

       QT中提供的标准控件能够满足我们大多数情况下的功能需求,但是在一些特殊应用场合,我们可能需要对控件的功能进行扩展,或者改写控件的功能实现。为满足此需求,QT提供了对标准控件的提升功能,用于重新自定义标准控件的实现。本文以QListWidget控件为例,详细介绍了控件提升的具体操作和实现。

琳琳简单点的博客 1200

Qt之实现自定义控件的两种方式——插件法

可以通过Qt设计师拖拽原生控件进行界面开发,但有时候原生控件不能满足项目需求。此时,就需要实现自定义控件。Qt中实现自定义控件,有两种方式,即提升法和插件法。本篇介绍插件法。新建一个自定义控件类,类名为myBattery,继承于QWidget类,该类主要负责实现自定义控件,注意此处使用Q_DECL_EXPORT 宏。private ://最小值 double maxValue;//最大值 double value;//目标电量 double alarmValue;

韩若熙的博客 7012

扬帆起航——Qt自定义控件介绍

扬帆起航——史上最强Qt自定义控件就要来啦!!! 这是一篇介绍,关于qt自定义控件的优势等。

m0_62599305的博客 2526

(一)Qt实现自定义控件的两种方式---提升法

在使用Qt设计师进行窗口设计时,我们会通过拖拽使用设计师中的原生控件来进行界面的开发,但有时候那些标准窗口部件无法满足我们的需求,这时候就需要我们进行自定义控件的使用。本系列文章主要讲述了使用提升法及插件法来实现自定义控件的使用,如有错误之处,欢迎大家批评指正。............

XCJandLL的博客 1万+

Qt控件自定义与提升实战指南

Qt使用类似于CSS的样式表来控制控件的外观。开发者可以使用样式表来统一设置控件的样式,也可以为特定的控件定制样式。通过方法,可以给控件应用自定义样式。样式表不仅可以用来定义字体、颜色和背景等视觉属性,还可以用来定义控件的布局和边框。例如,设置按钮的样式可以使用如下代码:在Qt中,开发者经常需要扩展或定制控件以满足特定的业务需求。自定义控件继承自现有的Qt控件类,允许开发者在保持Qt框架强大功能的同时,添加或修改控件的行为和外观。

weixin_31800911的博客 814

Qt控件提升:深入理解与实践

在当今的软件开发领域中,Qt框架以其跨平台性、丰富组件库以及强大的工具集合脱颖而出,为开发者提供了极大的便利。本章将首先探讨Qt框架的核心概念,例如信号与槽机制(Signal and Slot)、元对象系统(Meta-Object System)以及事件处理模型,为读者奠定扎实的理论基础。随后,我们将介绍Qt的主要特性,包括但不限于GUI组件、网络编程、数据库交互以及多线程处理等。最后,我们详细讲述如何搭建一个高效的Qt开发环境,涵盖必要的安装步骤、配置工具以及调试环境,让读者能够迅速上手。

weixin_42599558的博客 1037

【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

LF__plus的博客 2518

Field _II 仿真 学习笔记

参考Field II的使用说明,进行了四个例子的练习。仿真程序和结果如下: PURPOSE1:Calculate the received response from all elements of a linear array and plot the responses and the summed response 【计算来自所有线性阵元的接收响应,并绘制该响应以及叠加响应。】 >>

qq_34018578的博客 1万+

【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果

【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果

LF__plus的博客 4832

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 407

C#:WPF格式转Winform格式

WPF格式转Winform格式

Hello C++ 1295

QT控件与提升(自定义类)

在Qt开发中,控件提升是一个实用但常被低估的概念。它通过将标准的基础控件(Base Widget)升级为功能更强大、更定制化的自定义控件(Custom Widget),从而允许开发者在设计界面时突破Qt基础控件的限制,实现更复杂的功能和更优化的用户体验。这一概念与C++编程中“接口与实现分离”的原则不谋而合。正如Scott Meyers在《Effective C++》中所强调的,这种分离能够增强代码的灵活性和可维护性。

菜一头包的博客 2268

【RK3588开发记录】超详细的RK3588修改debug串口波特率为115200

修改RK3588的debug串口为115200

Crazydrams的博客 4805

【Qt 控件】Qt 控件提升指南:从基础到高级应用

控件提升是一个在Qt编程中常见但容易被忽视的概念。简单来说,控件提升就是将一个基础控件(Base Widget)转换为一个更特定、更复杂的自定义控件(Custom Widget)。这样做的目的是为了在设计界面时能够使用更多高级功能,而不仅仅是Qt库提供的基础控件。 在C++编程的经典名著《Effective C++》中,Scott Meyers强调了“接口和实现分离”的重要性。控件提升正是这一原则的一个应用:你可以在不改变界面设计的情况下,更换控件的底层实现。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3876

OpenAI Codex 桌面端国内使用全坑解決指南(2026 Windows 实测)

本地文件报错:SQLite 初始化失败、启动闪退、卡加载页 → 本地缓存/数据库损坏,和网络无关网络地区报错→ 网络IP/地区被拦截,和本地软件文件无关Codex 桌面端的大部分报错,都不是软件故障,而是海外软件适配国内网络、国内模型协议不兼容导致的适配问题。不用盲目重装、换网络、改系统设置,只要区分「本地文件问题」和「网络地区问题」,搭配国内大模型 API 替代方案,就能完美解决所有痛点。(注:部分内容可能由 AI 生成)

ups_hxc的博客 1114

数学建模--十大经典常用算法

数学建模十大算法:灰色预测,蒙特卡洛,遗传算法,模拟退火法,组合算法,神经网络,动态规划,聚类算法,类比法,概率算法,Floyd算法

qq_51533426的博客 5647

Qt之实现自定义控件的两种方式——提升法

可以通过Qt设计师拖拽原生控件进行界面开发,但有时候原生控件不能满足项目需求。此时,就需要实现自定义控件。Qt中实现自定义控件,有两种方式,即提升法和插件法。本篇介绍提升法。新建一个自定义控件类,类名为MyBattery,继承于QWidget类,该类主要负责实现自定义控件。//绘制准备工作,启用反锯齿 QPainter painter(this);//绘制边框 drawBorder(& painter);//绘制背景 drawBg(& painter);

韩若熙的博客 1万+

基于激光雷达与视觉融合的四旋翼无人机室内避障方法研究

本文研究了一种基于激光雷达与视觉融合的四旋翼无人机室内避障方法。针对单一传感器在室内环境中的局限性,提出通过激光雷达提供精确几何距离、视觉相机补充语义信息的融合方案。研究内容包括:搭建ROS硬件平台集成单目相机与2D激光雷达;设计基于扩展卡尔曼滤波的传感器融合模型;改进VFH算法结合视觉深度图进行路径规划。实验验证表明,该方法在复杂室内环境下具有较高的鲁棒性、实时性与避障成功率,为解决无GPS信号环境下的无人机自主导航问题提供了有效方案。

huanghm88的专栏 348

Qt学习:将ui界面中的默认控件提升为自定义类

自定义控件在动态添加到界面时很容易,只要new就可以了。当然在MainWindow的界面中要动态添加控件还是有问题的,跟普通的窗口不一样。 1、怎样在MainWindow动态插入控件 普通窗口只需要new一个layout,然后将在这个layout里添加控件即可,如下: QHBoxLayout * layout = new QHBoxLayout; this->set...

壁立千仞无欲则刚的博客 1万+

爬虫法律风险与合规边界

爬虫技术的法律边界正在快速收紧。从2017年上海晟品案开启爬虫入刑先河,到2025年Cloudflare区块链溯源技术将违规行为与企业主体永久绑定,合规已从"可选项"变为"必选项"。技术团队需要建立三层防御体系法律合规层:法律适用判定、授权管理、合同审查、隐私政策;技术控制层:访问控制、数据加密、匿名化、审计日志、监控告警;组织管理层:DPO任命、培训体系、应急响应、合规审计、绩效考核。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1161

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 【QT入门】Qt自定义控件与样式设计之qss的加载方式
下一篇: 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置
从一的
博客等级 码龄5年 1995粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值