Qt自定义窗口部件/控件(实现一个十六进制微调框SpinBox)

news/2024/7/24 11:19:43 标签: qt, 开发语言, 自定义窗口部件, c++, ui

目录

  • 1、自定义Qt窗口部件/控件
  • 2、十六进制微调框(SpinBox)
    • 2.1、实现思路
    • 2.2、源码
  • 3、使用方法
  • 4、缺点


1、自定义Qt窗口部件/控件

在某些情况下,我们发现Qt窗口控件需要更多的自定义定制,这些定制可能要比它在Qt设计师里可设置的属性或者对它调用的那些函数更多一些。一个简单而直接的解决方法就是对相关的窗口部件类进行子类化并且使它能够满足我们的需要。

本文主要是通过实现一个十六进制微调框,来演示自定义窗口控件如何使用。

2、十六进制微调框(SpinBox)

QSpinBox一般只支持十进制整数,但是通过重写部分方法,可以让它支持十六进制数值。

2.1、实现思路

1、我们通过正则限制输入的数字和字符 [0-9a-fA-F]{1,8}
2、重写validate方法,用来检查目前为止输入文本的合法性。
3、重写textFromValue方法,用来把一个整数值转换成一个字符串。这里我们需要改为十六进制的规则。
4、重写valueFromText方法,用来把字符串到整数值的逆向转换。同样我们也需要改为十六进制的规则。

2.2、源码

HexSpinBox.h

#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H

#include <QSpinBox>

class HexSpinBox : public QSpinBox
{
public:
    HexSpinBox(QWidget* parent = nullptr);

protected:
    // 重写三个重要的方法
    QValidator::State validate(QString& text, int& pos) const override;
    int valueFromText(const QString& text) const override;
    QString textFromValue(int value) const override;

private:
    QRegExpValidator* validator;

};

#endif // HEXSPINBOX_H

HexSpinBox.cpp

#include "HexSpinBox.h"

HexSpinBox::HexSpinBox(QWidget* parent)
    :QSpinBox{parent}
{
    setRange(0, 255);
    validator = new QRegExpValidator(QRegExp("[0-9a-fA-F]{1,8}"), this); // 0x00 0xFF

}

QValidator::State HexSpinBox::validate(QString &text, int& pos) const
{
    return validator->validate(text, pos);
}

int HexSpinBox::valueFromText(const QString& text) const
{
    return text.toInt(nullptr, 16);
}

QString HexSpinBox::textFromValue(int value) const
{
    return QString::number(value, 16).toUpper();
}

3、使用方法

常规使用方法有俩种,可以是通过代码直接创建HexSpinBox控件,也可以是通过Qt设计师提升窗口部件。

3.1、代码添加自定义窗口部件/控件

代码很简单,与正常的控件使用方法一样。

    HexSpinBox spin;
    spin.show();

3.2、Qt设计师添加自定义窗口部件/控件

步骤:

  1. 从Qt设计师的窗口部件工具栏中拖动一个QSpinBox到窗体中,由此创建一个QSpinBox。
  2. 右键单击这个微调框,并且从上下文菜单中选择"Promote to Custom Widget"(改进成自定义 窗口部件)。
  3. 在弹出的对话框中,填人“HexSpinBox"作为类的名字,填人“hexspinbox.h"作为头文件的 名字。

在右侧可以找到这个对象的类型已经是HexSpinBox就表示成功了。
在这里插入图片描述

3.3、运行效果

在这里插入图片描述

4、缺点

在Qt设计师中,无法对自定义窗口部件中的那些特定属性进行访问,并且也无法对这个窗口部件自身进行绘制。所有这两个问题都可以通过使用插件法得到解决。下一章节将会讲到。


http://www.niftyadmin.cn/n/467850.html

相关文章

【跟小嘉学 Rust 编程】六、枚举和模式匹配

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

Springboot-- 注解字段校验,并统一设置返回值

Springboot-- 注解字段校验&#xff0c;并统一设置返回值 引包&#xff1a;import org.springframework.validation.annotation.Validated; <!--web--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

华为eNSP入门实验,Vlan配置,路由配置,用户模式,链路聚合

文章目录 一、同一交换机下的PC通信二、不交换机下的PC通信三、配置静态路由通信四、路由器rip协议配置五、路由器ospf协议配置六、单臂路由七、通过三层交换机使不同的Vlan能连通八、设备consolo密码模式九、设备consolo用户密码模式&#xff08;AAA模式&#xff09;十、Telne…

【kubernetes系列】Kubernetes中的重要概念

​ 在学习k8s之前&#xff0c;必须先了解 Kubernetes 的几个重要概念&#xff0c;它们是组成 Kubernetes 集群的基石。&#xff08;参考Kubernetes权威指南&#xff09; 一、Master Kubernetes 里的Master指的是集群的控制节点&#xff0c; 每个Kubernetes 集群里至少需要有一…

API 接口协作,swagger不再是第一选择了

目录 一、前言 1.1. 场景一、后端视角&#xff1a; 1.2. 场景二、前端视角&#xff1a; 1.3. 场景三、测试视角&#xff1a; 二、Apifox 2.1 场景一、后端视角&#xff1a; 漂亮的接口文档 2.2 场景二、前端视角&#xff1a; 2.3 场景三、测试视角&#xff1a; 三、总…

HTML5+css3:3D旋转木马效果相册实现

1 、 perspective perspective 属性包括两个属性&#xff1a; none 和具有单位的长度值。 其中 perspective 属性的默认值为 none &#xff0c;表示无限的角度来看 3D 物体&#xff0c;但看上去是平的。另一个值 <length> 接受一个长度单位 大于 0 的值。而且其单位不…

以太网通信的回环测试

PHY 芯片通常带有回环&#xff08;Loopback&#xff09;功能&#xff0c;用于 PHY 通信链路的测试。本文主要讨论三种常用 PHY 芯片的回环功能&#xff0c;并使用 Broadcom 的 B50612D 芯片进行 PHY 回环测试。 1 常见PHY芯片的回环功能 1.1 KSZ9031 KSZ9031 芯片支持以下两种…

Istio 熔断 连接池 故障处理

istio熔断 熔断主要是无感的处理服务异常并保证不会发生级联甚至雪崩的服务异常。在微服务方面体现是对异常的服务情况进行快速失败&#xff0c;它对已经调用失败的服务不再会继续调用&#xff0c;如果仍需要调用此异常服务&#xff0c;它将立刻返回失败。 与此同时&#xff0…