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

QT学习教程(二十一)

​​​​​​自定义 Qt 控件(Customizing Qt Widgets

用户自定义的控件可以通过继承现有的Qt 控件实现,也可以直接从 QWidget 继承。这两种方法我们都进行介绍。介绍自定义控件如何放到 Qt Designer 的控件列表中象 Qt 自己

的控件一样使用。最后介绍一个使用双缓冲的自定义控件,双缓冲是实现高速绘制图形的一种技术。在某些情况下,我们发现有些Qt 控件通过设置它的属性或者函数不能满足我们的要求,还需要更多的要求。一个简单且直接的解决方法就是从这些 Qt 继承然后让它们满足我们的需要。

图  the HexSpinBox widget

我们开发一个十六进制的旋转盒来说明怎样来自定义 Qt 的控件。QSpinBox 只支持十进制整数,但是继承它是新类能够接受和显示十六进制数值是非常简单的。

#ifndef HEXSPINBOX_H #define HEXSPINBOX_H 
#include <QSpinBox> 
class QRegExpValidator;
class HexSpinBox : public QSpinBox
{
Q_OBJECT
public:
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 继承了很多QSpinBox 的功能。它提供了一个典型的构造函数,重写了

QSpinBox 的三个虚函数。

#include <QtGui> 
#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();
}
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 到 2 5 5(0X00 到 0XFF),在 QSpinBox 中默认的范围是 0 到99,在十六进制中,前者合理多了。用户可以点击上下箭头修改旋转盒的当前值,也可在编辑框里直接输入一个值。如果是字母,我们限制用户的只能输入合理的十六进制数字。为了做到这一点,我们使用一个 QRegExpValidator,它只允许输入数字 0 到 9,A 到F,和小写字母a 到f。QSpinBox 调用函数 validate()确定是否输入的文本是合法的。它会产生三个可能的结果: Invalid(不合法),Intermediate(输入的文本是一个合理值的合理部分),Acceptable(文本是合理的)。QRegExpValidator 有一个合适的 validate()函数,所以我们就返回调用他的结果。在理论上,如果超过了范围,我们需要返回 Invalid 或者Intermediate,但是 QSpinBox能够帮助我们做这些。函数textFromValue()把一个整数变换为一个字符串。当用户点击上下箭头时,QSpinBox 调用这个函数更新旋转盒的编辑部分。16 作为基数,QString::number()把数值转换为小写的十六进制,QString::toUpper()将得到的结果转换为大写。函数valueFromText()实现了逆转换,把字符串转换为整数。当用户在旋转盒的编辑框中输入一个数值时由QSpinBox 调用。使用 16 作为基数,把当前的文本转换为整数值,如果文本不能转换为十六进制数值,ok 置为false,toInt()返回 0 值。这里我们不需要考虑这个可能性,因为validator 只允许输入合法的十六进制字符。我们也可以不传递 ok 的地址,使用一个空指针也可以。

自定义其他 Qt 控件也遵循一样的步骤,选择一个合理的Qt 控件,把它作为基类,然后重新实现一些虚函数改变它的行为以满足我们的需要。

http://www.xdnf.cn/news/923905.html

相关文章:

  • redis主从复制
  • go中的接口返回设计思想
  • AI Agent 与 Agentic AI 企业实践
  • 湖北理元理律师事务所:债务优化中的民生保障实践
  • 【C/C++】std::vector成员函数清单
  • 力扣HOT100之二分查找:33. 搜索旋转排序数组
  • Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试
  • 如何理解ES6模块化方案的缓存机制?
  • SpringBoot离线应用的5种实现方式
  • 【python】RGB to YUV and YUV to RGB
  • 使用python实现奔跑的线条效果
  • 【八股消消乐】MySQL存储引擎InnoDB知识点汇总
  • 深入解析快速排序算法:原理、优化与应用
  • java内存模型JMM
  • 图上合成:用于大型语言模型持续预训练的知识合成数据生成
  • Python: 告别 ModuleNotFoundError, 解决 pipx 环境下 sshuttle 缺少 pydivert 依赖的终极指南
  • Redis Key过期策略
  • 关于 ​​Thread 与 Runnable​​ 以及 ​​线程生命周期​​ 的详细说明与示例
  • Protobuf 中的类型查找规则
  • ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题
  • 现代C++特性(一):基本数据类型扩展
  • Unity的日志管理类
  • 东芝Toshiba e-STUDIO2110AC打印机信息
  • 用电脑通过USB总线连接控制keysight示波器
  • csrf攻击学习
  • Java 8 Stream API 入门到实践详解
  • Robot Framework 一个通用的 自动化测试框架
  • 【DAY42】Grad-CAM与Hook函数
  • 大模型Agent智能体介绍和应用场景
  • SpiritTools:一款小而精的实用工具箱