当前位置: 首页 > news >正文

QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧

文章目录

  • 0.前言
  • 1.带命名空间Qt自定义类在QT设计器中的使用技巧
    • 1.1 定义一个带命令空间QLabel自定义类
    • 1.2 在QT设计器中引入自定义控件类
  • 2.带命名空间Qt自定义类在qss中的使用技巧
    • 2.1 命名空间在 QSS 中的特殊语法
    • 2.1 在QSS中定义带命名空间的样式
  • 3.在项目中使用带命名空间的Qt自定义控件类
  • 4.总结

0.前言

在大型QT项目中我们需要定义自己的自定义控件库,而这种自定义控件为了避免类名冲突往往都会将类放到特定的命名空间中,从而会在一些场景中导致使用上的问题,本篇文章主要介绍Qt自定义控件在Qt设计器中使用的问题和qss中样式的定义问题。

1.带命名空间Qt自定义类在QT设计器中的使用技巧

1.1 定义一个带命令空间QLabel自定义类

// ColorTextLabel.h


#ifndef COLORTEXTLABEL_H
#define COLORTEXTLABEL_H#include <QLabel>
#include <QMetaObject>
#include <QMetaEnum>namespace CustomCotrols
{class ColorTextLabel : public QLabel{Q_OBJECTQ_ENUMS(ColorMode)Q_PROPERTY(ColorMode colorMode READ colorMode WRITE setColorMode NOTIFY colorModeChanged)public:enum ColorMode {Normal,Success,Warning,Danger};explicit ColorTextLabel(QWidget *parent = nullptr);~ColorTextLabel();ColorMode colorMode() const;void setColorMode(ColorMode mode);signals:void colorModeChanged(ColorMode mode);private:ColorMode m_colorMode;};
}
#endif // COLORTEXTLABEL_H

#include “ColorTextLabel.h”

// ColorTextLabel.cpp
namespace CustomCotrols
{ColorTextLabel::ColorTextLabel(QWidget *parent) : QLabel(parent), m_colorMode(Normal){// 设置对象名称以便在QSS中引用setObjectName("ColorTextLabel");// 启用样式表中的属性选择器setProperty("colorMode", Normal);}ColorTextLabel::~ColorTextLabel(){}ColorTextLabel::ColorMode ColorTextLabel::colorMode() const{return m_colorMode;}void ColorTextLabel::setColorMode(ColorMode mode){if (m_colorMode != mode) {m_colorMode = mode;setProperty("colorMode", mode);style()->unpolish(this);style()->polish(this);update();emit colorModeChanged(mode);}}
}

1.2 在QT设计器中引入自定义控件类

实际项目开发中为了提高开发效率,对于比较固定的页面我们都是通过Qt设计器进行布局的,而要在Qt设计器中使用自定义类,我们需要对Qt内置空间类进行提升。
在提升对话框上填写提升类名时需要将命名空间全部写上CustomCotrols::ColorTextLabel,写头文件时如果头文件有目录需要将目录也写上CustomControls/ColorTextLabel,这样就能正常使用带命名空间的自定义Qt类了。

2.带命名空间Qt自定义类在qss中的使用技巧

2.1 命名空间在 QSS 中的特殊语法

在 C++ 中,命名空间的写法是使用 “::”,比如MyNamespace::MyCustomWidget,用于明确标识类所属的命名空间,避免命名冲突。然而,在 QSS 中,这种写法会与 Q 的子控件写法产生冲突。为了解决这个问题,QSS 采用了 “–” 来表示命名空间 。

2.1 在QSS中定义带命名空间的样式

/* styles.qss */
CustomCotrols--ColorTextLabel {border: 1px solid #cccccc;border-radius: 4px;padding: 6px;min-height: 24px;color: #333333;
}CustomCotrols--ColorTextLabel[colorMode="0"] { /* Normal */background-color: #f0f0f0;
}CustomCotrols--ColorTextLabel[colorMode="1"] { /* Success */background-color: #d4edda;color: #155724;border-color: #c3e6cb;
}CustomCotrols--ColorTextLabel[colorMode="2"] { /* Warning */background-color: #fff3cd;color: #856404;border-color: #ffeeba;
}CustomCotrols--ColorTextLabel[colorMode="3"] { /* Danger */background-color: #f8d7da;color: #721c24;border-color: #f5c6cb;
}

3.在项目中使用带命名空间的Qt自定义控件类

// main.cpp (示例使用)
#include <QApplication>
#include "colortextlabel.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);// 加载QSS样式QFile styleFile(":/styles.qss");if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text)) {QString styleSheet = styleFile.readAll();a.setStyleSheet(styleSheet);styleFile.close();}// 创建示例标签ColorTextLabel label("Hello World");label.setColorMode(ColorTextLabel::Success);label.show();return a.exec();
}

4.总结

带命名空间的QT类在QT设计器中和qss中使用时都需要把命名空间带上。

http://www.lqws.cn/news/209287.html

相关文章:

  • 多线程中的泛型应用深度解析:类型安全与并发编程的完美融合
  • 【Unity】模型
  • c++ 单例模式
  • 二.单例模式‌
  • nonlocal 与global关键字
  • vue3 创建图标 按钮
  • rl_sar实现sim2real的整体思路
  • Jetpack Compose瀑布流实现方案
  • 设计模式-观察着模式
  • 行为型设计模式之Interpreter(解释器)
  • C++常用的企业级日志库
  • DeepSeek-R1-0528:开源推理模型的革新与突破
  • 在Ubuntu22.04 系统中安装Docker详细教程
  • 低代码平台前端页面表格字段绑定与后端数据传输交互主要有哪些方式?华为云Astro在这方面有哪些方式?
  • 银行卡二三四要素实名接口如何用PHP实现调用?
  • Linux操作系统故障应急场景及对应排查方法
  • Linux 系统中的算法技巧与性能优化
  • code-server安装使用,并配置frp反射域名访问
  • 【PCIe总线】 -- PCI、PCIe相关实现
  • Java高级 | 【实验七】Springboot 过滤器和拦截器
  • WPF 播放器(AudioPlayer 2025)
  • vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
  • mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
  • 【数据结构】6. 时间与空间复杂度
  • STM32学习笔记:外部中断(EXTI)原理与应用详解
  • 如何使用Jmeter进行压力测试?
  • NLP学习路线图(三十一): 迁移学习在NLP中的应用
  • 知识改变命运?如何有规划的学好计算机专业?
  • 元器件基础学习笔记——结型场效应晶体管 (JFET)
  • MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)