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
  опции профиля:
сообщение 27.12.2011, 12:06
Сообщение #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);
    app.setStyleSheet("QWidget{font: 11pt;}"); 

    QWidget widget;
    HexSpinBox* spinBox1;
    HexSpinBox* spinBox2;

    spinBox1 = new HexSpinBox(&widget);
    spinBox1->setRange(0xA, 0xC00);
    spinBox1->setValue(0xB0);
    spinBox1->move(10,10);

    spinBox2 = new HexSpinBox(&widget);
    spinBox2->setRange(0xA, 0xC00);
    spinBox2->setValue(0xB0);
    spinBox2->move(10,50);

    widget.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();
    return (validator->validate(text,pos));
}

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

QString HexSpinBox::textFromValue(int value) const
{
    return QString("%1").arg(value, 6, 16, QLatin1Char('0')).toUpper();
}
Цитата
Вам же этого не хотелось. Вам хотелось чтобы пользователь просто не мог вводить и все.
Мне на самом деле хотелось, чтобы пользователю было max удобно вводить данные, и чтобы программа была написана так, как положено у хороших программистов.
А Вы, BlueIceScream, мне очень подробно пояснили этот пример. Благодарю Вас!

И еще на тему ввода...
В окне диалога задаю значения для нескольких параметров, затем закрываю диалог, нажав одну из кнопок Применить или Отмена. Для некоторых параметров просто выбираю одно значение.
А вот для других выбираю диапазон, то есть задаю и min, и max значение.
Я позволяю задать min значение больше max значения, а по кнопке Применить в таком случае отображаю эти значения красным цветом, а также вывожу в окне диалога красным цветом надпись "Неверно задан диапазон значений". А как это обычно делают?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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


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