crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Steklova Olga
  опции профиля:
сообщение 23.12.2011, 16:18
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Здравствуйте!
Мне понадобился в программе виджет для редактирования 16-ного числа с диапазоном [0..FFFFFF].
Использовала для этого QLineEdit.
QRegExp regExp("[0-9A-Fa-f]{0,6}"); 
lineEdit->setValidator(new QRegExpValidator(regExp, this));
Более-менее работает, но хочется менять значение по стрелочкам, как в QSpinBox.
Нашла в книге Ж.Бланшет "Qt4 программирование QUI на C++" в главе 5 пример,
где на основе QSpinBox создается класс HexSpinBox.
Там установлен диапазон значений, он правильно анализируется при изменении значения по стрелочкам, НО юзер может ввести значение, превышающее диапазон. Как это исправить?

Сообщение отредактировал Steklova Olga - 27.12.2011, 10:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 26.12.2011, 18:33
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Получился вот такой код (правда, в таком варианте очень неудобно редактировать число в строке):
main.cpp
Раскрывающийся текст
#include <QApplication>

#include "hexspinbox.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    HexSpinBox spinBox;
    spinBox.setWindowTitle(QObject::tr("Hex Spin Box"));
    //
    spinBox.setRange(0x0, 0xFFFFFF); //этот вариант работает как надо
    spinBox.setValue(spinBox.minimum());
    //
    //spinBox.setRange(0xA, 0xC00); //и этот вариант работает как надо
    //spinBox.setValue(0xB0);
    //
    spinBox.show();
    return app.exec();
}
hexspinbox.h:
Раскрывающийся текст
#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.cpp:
Раскрывающийся текст
#include <QtGui>

#include "hexspinbox.h"

HexSpinBox::HexSpinBox(QWidget *parent)
    : QSpinBox(parent)
{
    validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,6}"), this);
}

QValidator::State HexSpinBox::validate(QString &text, int &pos) const
{
    text = text.toUpper();
    int value = text.toInt(0, 16);
    if ((value >= this->minimum()) && (value <= this->maximum()))
        return (validator->validate(text,pos));
    else
        return QValidator::Invalid;
}

int HexSpinBox::valueFromText(const QString &text) const
{
    bool ok;
    return text.toInt(&ok, 16);
}

QString HexSpinBox::textFromValue(int value) const
{
    //return QString::number(value, 16).toUpper(); //этот вариант работает

    //но я решила, что такой вариант будет лучше
    return QString("%1").arg(value, 6, 16, QLatin1Char('0')).toUpper();
}

PS Получается, что в книге Бланшет фраза на стр. 106 ошибочна?
("Теоретически следует возвращать Invalid или Intermediate для значений, лежащих вне диапазона наборного счетчика, но QSpinBox достаточно "умен" и может самостоятельно отследить эту ситуацию.")

Сообщение отредактировал Steklova Olga - 27.12.2011, 10:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.6.2025, 11:22