c – 带有无符号Int的QSpinBox,用于十六进制输入

前端之家收集整理的这篇文章主要介绍了c – 带有无符号Int的QSpinBox,用于十六进制输入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这里有很多关于QSpinBox使用int作为其数据类型的限制的问题.通常人们想要显示更大的数字.在我的例子中,我希望能够以十六进制显示无符号的32位整数.这意味着我希望我的范围为[0x0,0xFFFFFFFF].普通QSpinBox可以达到的最大值是0x7FFFFFFF.在这里回答我自己的问题,我提出的解决方案是通过重新实现相关的显示和验证功能,简单地强制int被视为unsigned int.

解决方法

结果很简单,效果很好.在这里分享以防其他人可以从中受益.它具有32位模式和16位模式.
class HexSpinBox : public QSpinBox
{
public:
    HexSpinBox(bool only16Bits,QWidget *parent = 0) : QSpinBox(parent),m_only16Bits(only16Bits)
    {
        setPrefix("0x");
        setDisplayIntegerBase(16);
        if (only16Bits)
            setRange(0,0xFFFF);
        else
            setRange(INT_MIN,INT_MAX);
    }
    unsigned int hexValue() const
    {
        return u(value());
    }
    void setHexValue(unsigned int value)
    {
        setValue(i(value));
    }
protected:
    QString textFromValue(int value) const
    {
        return QString::number(u(value),16).toUpper();
    }
    int valueFromText(const QString &text) const
    {
        return i(text.toUInt(0,16));
    }
    QValidator::State validate(QString &input,int &pos) const
    {
        QString copy(input);
        if (copy.startsWith("0x"))
            copy.remove(0,2);
        pos -= copy.size() - copy.trimmed().size();
        copy = copy.trimmed();
        if (copy.isEmpty())
            return QValidator::Intermediate;
        input = QString("0x") + copy.toUpper();
        bool okay;
        unsigned int val = copy.toUInt(&okay,16);
        if (!okay || (m_only16Bits && val > 0xFFFF))
            return QValidator::Invalid;
        return QValidator::Acceptable;
    }

private:
    bool m_only16Bits;
    inline unsigned int u(int i) const
    {
        return *reinterpret_cast<unsigned int *>(&i);
    }
    inline int i(unsigned int u) const
    {
        return *reinterpret_cast<int *>(&u);
    }

};

猜你在找的C&C++相关文章