Поиск:

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


Бывалый
*


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

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



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

Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
#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


Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#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;
}


Выделить всёРазвернуть кодкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
#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


Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
#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 секунд
я переделал класс. Проблема еще в конструкторе была
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
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


Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
#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 не существует). Поэтому его разыменовывать нельзя!
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
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



Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
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.1190 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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