自定义窗口部件

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

HexSpinBox.h

#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H#include <QSpinBox>class QRegExpValidator;class HexSpinBox : public QSpinBox
{Q_OBJECTpublic:HexSpinBox(QWidget *parent = 0);protected:QValidator::State validate(QString &text, int &pos) const;int valueFromText(const QString &text) const;QString textFromValue(int value) const;private:QRegExpValidator *validator;
};#endif // HEXSPINBOX_H

HexSpinBox从QSpinBox中继承了它的绝大多数功能,它提供了一个典型的构造函数,并且重新实现了QSpinBox中的三个虚函数。

HexSpinBox.cpp

#include <QtWidgets>#include "hexspinbox.h"HexSpinBox::HexSpinBox(QWidget *parent): QSpinBox(parent)
{setRange(0, 255);validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
}QValidator::State HexSpinBox::validate(QString &text, int &pos) const
{return validator->validate(text, pos);
}QString HexSpinBox::textFromValue(int value) const
{return QString::number(value, 16).toUpper();
}int HexSpinBox::valueFromText(const QString &text) const
{bool ok;return text.toInt(&ok, 16);
}

构造函数
我们设置的默认范围是从0到255(即从0x00到0xFF)。对于十六进制微调框来说,这样的设置比QSpinBox的默认设置值范围(从0到99)更为合适些。

用户可以通过单击微调框的向上和向下箭头或者在它的行编辑器中输人数值来修改微调框的当前值。在后一种情况中,我们想要严格控制用户输人的数据必须是合法的十六进制数字。为了实现这一点,我们使用一个QRegExpValidator,它可以接受1到8个字符,所有这些字符都必须是集合{‘0’,…,‘9’,‘A’,.,‘F’,‘a’,…,‘f’}中的一个。

validate
这个函数由QSpinBox 调用,用来检查目前为止用户输人文本的合法性。

有三种结果可能会出现:Invalid(无效,输人的文本与常规表达式不匹配)、Intermnediate(部分有效部分无效,输入的文本是一个有效值中似是而非的一部分)以及Acceptable(可以接受输入的文本合法有效)。

QRegExpValidator有一个合适的validate()函数,因此只需返回对其调用后的最终结果即可。理论上,应当为位于微调框范围之外的那些值返回Invalid或者Intermediate,但是QSpinBox具有很好的自适应性,它可以在没有任何帮助的情况下检测出那种情况。

textFromValue
textFromValue()函数把一个整数值转换成一个字符串。当用户按下微调框的向上或者向下箭头时,QSpinBox会调用它来更新微调框的编辑器部分。我们使用静态函数QString::number(),将其第二个参数设置为16,把该值转换为小写格式的十六进制字符串,并且对结果调用QString::toUpper(),使其成为大写格式的结果。

valueFromText
valueFromText()函数执行从字符串到整数值的逆向转换。当用户在微调框的编辑器部分输人一个值并且按下Enter时,QSpinBox就会调用它。我们使用QString::toInt()试着把当前文本转换成一个整数值,当然还是使用16作为基数。如果这个字符串不是有效的十六进制数,那么就把ok设置为false,并且由toInt()返回一个0。

在这里,不需要考虑这种可能出现的情况,因为此处的验证器只允许输人有效的十六进制字符串。我们希望能够给toInt()的第一个参数传递的是一个空指针,而不是传递一个虚拟变量(ok)的地址。

main.cpp

#include "hexspinbox.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);HexSpinBox w;w.show();return a.exec();
}


现在已经完成了这个十六进制微调框。自定义其他Qt窗口部件也可以遵循相同的模式:选择一个合适的Qt窗口部件,对它进行子类化,并且通过重新实现一些虚函数来改变它的行为即可。如果我们想做的全部就是对一个已经存在的窗口部件的外观进行自定义设置,那么只需对其应用一个样式表或者重新实现一种自定义风格即可,而不必对其进行子类化。

Qt4_十六进制微调框相关推荐

  1. 如何更改微调器的文字大小和文字颜色?

    本文翻译自:How to change spinner text size and text color? In my Android application, I am using spinner, ...

  2. android combobox控件,Android中的组合框

    在android组合框中称为微调框.然而,gnugu已经在自己的博客中发布了自己的一个组合框的实现. http://www.gnugu.com/node/57 以下是旋转器的一个简单示例. 首先,用这 ...

  3. java sqlite 创建_关于Java:创建3个由sqlite数据库填充的微调器

    我正在尝试实现一个活动,该活动具有3个微调器(下拉列表),每个微调器由sqlite数据库中的不同表填充. 我设法创建了一个已正确填充的微调器,但是在创建其他两个并正确填充它们时遇到了麻烦. 到目前为止 ...

  4. Qt4_在Qt设计师中集成自定义窗口部件

    在Qt设计师中集成自定义窗口部件 在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师先察觉到它们的存在.有两种方法可以完成这一任务:改进法(promotion)和插件法(pluigin). 改 ...

  5. 文本框底部套入勾选html,2017年3月全国二级MS OFFICE真题第2套

    小许正在撰写一篇有关质量管理的论文,按照如下要求帮助小许对论文进行编辑排版. 1.在考生文件夹下,将"Word素材.docx"件另存为"Word.docx"(& ...

  6. 用java实现十六进制代码与RGB互转的颜色转换器

    最近在学java,学完基础不知道做点什么好,心血来潮想写个小工具,某天突然发现十六进制转RGB很麻烦,网上一搜工具不是很多,大多都是在线转换,要是某天没网了怎么办呢??我想可能太简单了吧,大家都不愿意 ...

  7. C# 十进制与十六进制互相转换

    下面的代码和演示都使是基于前2篇文章的代码上添加的. 这个十进制和十六进制之前的相互转换是很简单的,但是在串口数据传输,或者上下位机之间数据传输中很常见的. 例如: 十六进制的字符串A6 转换为十进制 ...

  8. 2018年9月计算机二级考试《MS Office高级应用》基础自测卷

    2018年9月计算机二级考试<MS Office高级应用>基础自测卷 一.选择题(每小题1分.共20分) 1.下列链表中,其逻辑结构属于非线性结构的是(        ). A . 二叉链 ...

  9. halcon初级应用攻略

    标准 Halcon 应用攻略 1.Halcon 的自我描述 Program Logic ? Each program consists of a sequence of HALCON operator ...

最新文章

  1. tensorflow2.0中valid_data的作用是在训练的过程对对比训练数据与测试数据的准确率 损失率,便于判断模型的训练效果:是过拟合还是欠拟合(过拟合)
  2. 图挖掘与多关系学习:工具与应用,亚马逊与CMU-WWW2021教程(附ppt)
  3. 单片机IO口模拟SPI四种模式的程序
  4. 数据结构_栈和队列的区别
  5. 手写数字识别中多元分类原理_广告行业中那些趣事系列:从理论到实战BERT知识蒸馏...
  6. insert插入语句设置主键id回滚
  7. Python Challenge 过关心得(0)
  8. 从零开始学习Sencha Touch MVC应用之三
  9. 正则表达式详解及示例
  10. 魔窗mLink发布2019收费标准,20W年费是物有所值?还是重度收费?
  11. 信息系统项目管理师必背核心考点(五十八)变更管理的主要角色
  12. 【论文笔记】Hierarchical Paired Channel Fusion Network for Street Scene Change Detection
  13. halcon学习之路
  14. 记录:mysql的binlog日志开启与数据恢复
  15. 强基计划 数学相关书籍 推荐
  16. Centos 安装zlib
  17. C语言文件读取错误怎么解决,c语言中文件随机读取出错如何解决
  18. 使用A*算法求迷宫最短路径问题
  19. itext模板生成pdf 后添加动态表格
  20. ERROR in multi ./runoob1.js bundle.js Module not found: Error: Can't resolve 'bundle.js' in 'E:\app'

热门文章

  1. 系统更新后mysql用不了中文,Mysql在debian系统中不能插入中文的终极解决方案
  2. 微型计算机2016年12月下,2016年12月计算机一级MS Office练习及答案
  3. 复用管脚_如何实现UART的分时复用
  4. linux目标文件链接命令,ld 命令:将目标文件链接为可执行程序 - dute.org
  5. 全军出击机器人进房间_科沃斯扫地机器人T8 POWER/MAX开箱测评推荐
  6. webservice 调用慢问题解决
  7. MYSQL必知必会-where语句
  8. Jmeter中的变量(三)
  9. 第4.17章读书笔记
  10. IIS支持flv文件