根据C++GUI Qt4编程(第二版)
本程序实现一个十六进制微调窗并演示
hexspinbox.h文件
#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H
#include <QSpinBox>
class QRegExpValidator;
class HexSpinBox : public QSpinBox
{
Q_OBJECT
public:
explicit HexSpinBox(QWidget *parent = 0);
protected:
QValidator::State validate(QString &input, int &pos) const;
int valueFromText(const QString &text) const;
QString textFromValue(int val) const;
private:
QRegExpValidator*validator;
};
#endif // HEXSPINBOX_H
hexspinbox.cpp文件
#include "hexspinbox.h"
#include <QtGui>
#include <QRegExpValidator>
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 &input, int &pos) const
{
return validator->validate(input,pos);
}
int HexSpinBox::valueFromText(const QString &text) const
{
bool ok;
return text.toInt(&ok,16);
}
QString HexSpinBox::textFromValue(int val) const
{
return QString::number(val,16).toUpper();
}
然后就可以使用这个十六进制部件,在一个QDialog放置自定义的HexSpinBox,再放一个QLabel显示它对应的十进制。
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <hexspinbox.h>
class QLabel;
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
private:
QLabel *lb;
HexSpinBox *hexSpinBox;
private slots:
void showValue(int val);
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include <QtGui>
Dialog::Dialog(QWidget *parent) :
QDialog(parent)
{
QHBoxLayout *hBoxLayout = new QHBoxLayout;
hexSpinBox=new HexSpinBox;
lb = new QLabel;
hBoxLayout->addWidget(hexSpinBox);
hBoxLayout->addWidget(lb);
setLayout(hBoxLayout);
connect(hexSpinBox,SIGNAL(valueChanged(int)),this,SLOT(showValue(int)));
}
void Dialog::showValue(int val)
{
lb->setText(QString::number(val,10));
}
主函数:
#include <QApplication>
#include <dialog.h>
int main(int argc,char*argv[])
{
QApplication app(argc,argv);
Dialog *dlg = new Dialog;
dlg->show();
return app.exec();
}
显示效果图: