Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование от QValidator 
:(
    Опции темы
htzg
Дата 13.3.2012, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Создал свой Validator. Пытаюсь его установить в QLineEdit.
Почитал в инете как переопределять virtual функции. Вроде все понятно.
Компилятор пишет:
user posted image

Код

#ifndef LAYERSLINEVALIDATOR_H
#define LAYERSLINEVALIDATOR_H

#include <QValidator>

class LayersLineValidator : public QValidator
{
public:
    LayersLineValidator(){ myMaxValue=0;}

    void setMaxValue(int maxValue) {myMaxValue = maxValue;}
    int getMaxValue(){ return myMaxValue;}

    virtual QValidator::State    validate ( QString & input, int & pos ) ;//const = 0;
private:
    int myMaxValue;
};

#endif // LAYERSLINEVALIDATOR_H


Код

#include "layerslinevalidator.h"

#include <QStringList>

#include "fromQStringToQListInt.cpp"

//LayersLineValidator::LayersLineValidator()
//{
//}

virtual QValidator::State    validate ( QString & input, int & pos )// const = 0
{
    QList<int> numbers = fromQStringToQListInt(  input.mid(pos)  );

    if (numbers.begin() <= 0  ||  numbers.end() > myMaxValue  )
        return QValidator::Invalid;

    return QValidator::Acceptable;

}


Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

#include "layerslinevalidator.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private:
    Ui::MainWindow *ui;

    LayersLineValidator *layersLineValidator;
};

#endif // MAINWINDOW_H


Код

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    layersLineValidator = new LayersLineValidator(this);
    ui->layersLineEdit->setValidator(layersLineValidator);
}

MainWindow::~MainWindow()
{
    delete ui;
}

Где я не прав? 
PM MAIL   Вверх
borisbn
Дата 13.3.2012, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(htzg @  13.3.2012,  21:01 Найти цитируемый пост)
 virtual QValidator::State    validate ( QString & input, int & pos ) ;//const = 0;

нафига заремил ?
собственно, в этом и ошибка. const-функция и не-const - разные вещи


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
htzg
Дата 13.3.2012, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



borisbn, я и так пробовал.

Добавлено через 12 минут и 19 секунд
я переделал класс. Проблема еще в конструкторе была
Код

#ifndef LAYERSLINEVALIDATOR_H
#define LAYERSLINEVALIDATOR_H

#include <QValidator>

class LayersLineValidator : public QValidator
{
public:
    LayersLineValidator(QObject *parent = 0);

    void setMaxValue(int maxValue) {myMaxValue = maxValue;}
    int getMaxValue(){ return myMaxValue;}

    virtual QValidator::State    validate ( QString & input, int & pos ) const;// = 0;
private:
    int myMaxValue;
};

#endif // LAYERSLINEVALIDATOR_H


Код

#include "layerslinevalidator.h"

#include <QStringList>

#include "fromQStringToQListInt.cpp"

LayersLineValidator::LayersLineValidator(QObject *parent) :
        QValidator(parent)
{
}

virtual QValidator::State    validate ( QString & input, int & pos ) const //= 0
{
    QList<int> numbers = fromQStringToQListInt(  input.mid(pos)  );

    if (*numbers.begin() <= 0  ||  *numbers.end() > myMaxValue  )
        return QValidator::Invalid;

    return QValidator::Acceptable;

}


теперь пишет следующее
user posted image
PM MAIL   Вверх
bsa
Дата 14.3.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



htzg, ооо. Да ты еще и основ С++ не знаешь. "non-member function..." - переводится как "функция, не являющаяся методом, не может иметь квалификаторы const и volatile". Функция от метода отличается тем, что у метода перед названием стоит еще название класса, отделенное двумя двоеточиями. И вообще, ты написал "QValidator::" много где, но не там, где это действительно необходимо.
Далее, ключевое слово virtual допустимо только внутри тела класса или структуры (внутри class xxx {};), а у тебя снаружи.
PM   Вверх
htzg
Дата 14.3.2012, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



bsa, признаться, я правда много не знаю. Я не программист по образованию. И занимаюсь этим потому что есть интерес и полезность, т.к. с компьютерным моделированием имею дело. Нужно обрабатывать большие массивы данных и т.п.
Не могли бы Вы показать, как правильно оформить этот метод. Что бы я знал. smile
PM MAIL   Вверх
bsa
Дата 14.3.2012, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



QList::end() возвращает итератор, который указывает в "никуда" (официально, это зовется "указывает на элемент, следующий за последним"; но этого элемента в QList не существует). Поэтому его разыменовывать нельзя!
Код
QValidator::State QValidator::validate(QString &input, int &pos) const
{
    QList<int> numbers = fromQStringToQListInt(  input.mid(pos)  );
    if (numbers.isEmpty())
        return Acceptable;
    if ((numbers.first() > 0) && (numbers.last() <= myMaxValue))
        return Acceptable;
    return Acceptable;
}

PM   Вверх
htzg
Дата 14.3.2012, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



скопировал.
Пишет:
user posted image
myMaxValue нельзя использовать? Как быть?
PM MAIL   Вверх
_GRIN_
Дата 14.3.2012, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Код

virtual QValidator::State LayersLineValidator::validate ( QString & input, int & pos ) const
{
    QValidator::State ret_val = QValidator::Invalid; // предполагаем худшее =)
    
    // изменять numbers мы не будем - поэтому сделаем его const (хороший "защитный" стиль)
    const QList<int> numbers = fromQStringToQListInt(  input.mid(pos)  );
    
    if( (numbers.first() > 0) && (numbers.last() < = myMaxValue) )
    {
        ret_val = QValidator::Acceptable; // всё лучше чем мы думали вначале =)
    }
    return ret_val;
}



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.