5-1 自定义Qt控件(Customizing Qt Widgets)
来源:互联网 发布:js url encode 在线 编辑:程序博客网 时间:2024/06/05 12:40
在某些情况下,我们发现有些Qt控件通过设置它的属性或者函数不能满足我们的要求,还需要更多的要求。一个简单且直接的解决方法就是从这些Qt继承然后让它们满足我们的需要。
图5-1 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
#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);
}
#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到255(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控件,把它作为基类,然后重新实现一些虚函数改变它的行为以满足我们的需要。
- 5-1 自定义Qt控件(Customizing Qt Widgets)
- (转)5.1自定义Qt控件(Customizing Qt Widgets)
- Customizing Qt Widgets Using Style Sheets
- Qt Style Sheet(四) --- Customizing Qt Widgets Using Style Sheets
- Qt Style Sheet(四) --- Customizing Qt Widgets Using Style Sheets
- Qt 4.8 Customizing Qt Widgets Using Style Sheets
- 5-3 把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)
- 把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer(转)
- (翻译--qt风格化widget)Customizing Qt Widgets Using Style Sheets
- (转) 5.3把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)
- 把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)(转)
- 5.3把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)
- Qt Widgets
- Qt学习——控件Widgets
- Qt学习——控件Widgets
- Qt学习——控件Widgets
- QT学习笔记(5):自定义控件
- Qt自定义控件(三)
- 新闻标题太长,截取字段,鼠标放上去显示全部
- [原创] Tips: 两种目录遍历的方法
- 在java中用JDBC连接SQL Server 2000 的经验分享
- 核心对象Kernel Objects
- error LNK2001错误
- 5-1 自定义Qt控件(Customizing Qt Widgets)
- Collection List Set Map 区别记忆
- window.location.reload()与IsPostBack的一些解释
- 千呼万唤始出来——InfoQ中文站
- [转载]Linux中文件查找技术大全
- 在DTable中的新增和更新界面使用模板文件
- C#抽象工厂模式的几种实现方法及比较
- 利用 Oracle 10g 技能学习 DB2 9.1 for Linux, UNIX and Windows
- VC 时间操作实例