Russian Qt Forum
Ноябрь 23, 2024, 17:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ограничение количества символов в QTableView [РЕШЕНО]  (Прочитано 14416 раз)
LEO
Гость
« : Декабрь 26, 2012, 09:33 »

всем привет, столкнулся с проблемой ограничения вводимого текста в колонках таблицы.
Использую базу SQLite отображаю с помощью QTableView, в базе прописываю к примеру VARCHAR(5), однако во вьюхе прописываю 10 символов, смотрю в базу там 10 и отображает, как я понял SQLite не обрезает вводимые данные, как решить проблему, кто сталкивался может быть с подобным, есть ли стандартные методы ограничения?
« Последнее редактирование: Февраль 13, 2013, 12:50 от LEO » Записан
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #1 : Декабрь 26, 2012, 10:51 »

sqlite не проверяет размеры и типы полей, в поле int можно запросто записать varchar. Но это не баг это фича (с) Улыбающийся
Можно погуглить на предмет "sqlite3 типы данных" и можно будет найти ответ на вопрос почему так.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #2 : Декабрь 26, 2012, 10:54 »

А проверку в таком случае стоит делать в самом приложении, т.к. при работе например с тем же postgres при попытке записать в varchar(5) строку длиной 10 символов получим ошибку.
В редактируемых моделях не проверял, пишу про случай с обычным insert, но думаю ошибка вставки данных будет все равно.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
LEO
Гость
« Ответ #3 : Декабрь 26, 2012, 11:20 »

С SQLIte вроде разобрался и понял что надо именно в приложении делать ограничение, поэтому и обратился сюда, но каким образом ограничить? Есть ли стандартные ограничения во вьюхах по этому поводу?
Записан
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #4 : Декабрь 26, 2012, 11:36 »

С SQLIte вроде разобрался и понял что надо именно в приложении делать ограничение, поэтому и обратился сюда, но каким образом ограничить? Есть ли стандартные ограничения во вьюхах по этому поводу?

Как вариант проверять и отсекать лишнее прямо в модели в setData.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #5 : Декабрь 26, 2012, 11:45 »

С SQLIte вроде разобрался и понял что надо именно в приложении делать ограничение, поэтому и обратился сюда, но каким образом ограничить? Есть ли стандартные ограничения во вьюхах по этому поводу?
Или присмотреться к делегатам. Там можно все сделать более красиво.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Декабрь 27, 2012, 10:09 »

С SQLIte вроде разобрался и понял что надо именно в приложении делать ограничение, поэтому и обратился сюда, но каким образом ограничить? Есть ли стандартные ограничения во вьюхах по этому поводу?

Как вариант проверять и отсекать лишнее прямо в модели в setData.
Я бы так не делал.
Отсекать надо во время ввода.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #7 : Декабрь 27, 2012, 10:14 »

Я бы так не делал.
Отсекать надо во время ввода.

И я бы так не делал Улыбающийся
Но это тоже вариант как ни крути.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 27, 2012, 10:35 »

>присмотреться к делегатам. Там можно все сделать более красиво.
+1
Записан

Юра.
LEO
Гость
« Ответ #9 : Декабрь 27, 2012, 12:28 »

Сделал делегатом и тут возникли проблемы...

Как делал делегат:
.h
Код:
#ifndef DELEGATEVVODA_H
#define DELEGATEVVODA_H

#include <QItemDelegate>

class delegatevvoda : public QItemDelegate
{
    Q_OBJECT
public:
    explicit delegatevvoda(QObject *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;   
private slots:
 
signals:
   
public slots:
   
};

#endif // DELEGATEVVODA_H
.cpp
Код:
#include "delegatevvoda.h"
#include "QLineEdit"

delegatevvoda::delegatevvoda(QObject *parent) :
    QItemDelegate(parent)
{
}

QWidget *delegatevvoda::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
{

    QLineEdit *LineEdit = new QLineEdit(parent);
    LineEdit->setMaxLength(50);
    return LineEdit;
}

void delegatevvoda:: setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
    QLineEdit *LineEdit = qobject_cast<QLineEdit *>(editor);
    LineEdit->setText(value);
}

void delegatevvoda:: setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QLineEdit *LineEdit = qobject_cast<QLineEdit *>(editor);
    model->setData(index,LineEdit->text());
    return;
}

Применял делегат вот так:  ui->tableView->setItemDelegate(new delegatevvoda(this));


 к таблице  применен setStyleSheet:
 
Код:
QString v = "QTableView::item::focus{\n"\
            "border: yellow;\n"\
            "background-color :yellow;\n"\
            "selection-color : blue;\n"\
            "}"

            "QTableView {\n"\
            "selection-color: black;\n"\
            "selection-background-color: #7FFF00;\n"\
            "}";
    ui->tableView->setStyleSheet(v);


После использования делегата стили пропали, раньше ячейка на которой был фокус подсвечивалась желтым,
сейчас не подсвечивает...
и еще до применения делегата при вводе в ячейку строка растягивалась по вводимому тексту и был виден весь текст введенный , сейчас такого нету...
не могу разобраться... Непонимающий Непонимающий Непонимающий
« Последнее редактирование: Декабрь 27, 2012, 14:45 от LEO » Записан
LEO
Гость
« Ответ #10 : Январь 01, 2013, 22:23 »

Нужна помощь Непонимающий Непонимающий Непонимающий
« Последнее редактирование: Январь 01, 2013, 22:26 от LEO » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Январь 01, 2013, 22:42 »

Нужна помощь Непонимающий Непонимающий Непонимающий
Наследуйся не от QItemDelegate, а от QStyledItemDelegate.
Записан
LEO
Гость
« Ответ #12 : Январь 03, 2013, 10:16 »

Действительно отнаследовался от QStyledItemDelegate и появился фокус, но с растяжением строки проблема так и осталась...
добавил
Код:
void delegatevvoda::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
{
    editor->setGeometry(option.rect);
}

вот не понятно где едитору сказать чтоб он Lineedit рисовал по содержимому текста, по сути необходимо динамическое изменение Lineedita который по сути используется в качестве ячейки

пробовал такое:
Код:
LineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
не помогает... Непонимающий
что еще можно придумать по этому поводу?


« Последнее редактирование: Февраль 20, 2013, 09:11 от LEO » Записан
LEO
Гость
« Ответ #13 : Январь 11, 2013, 10:21 »

Перепробовал массу вариантов, теперь решил делать так и столкнулся с проблемой:
.h
Код:

class delegatevvoda : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit delegatevvoda(QObject *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
private slots: 
   void  resizeLineEditToContents();
private:
   QLineEdit *LineEdit;
};

.cpp
Код:
delegatevvoda::delegatevvoda(QObject *parent) :
    QStyledItemDelegate(parent)
{
}

QWidget *delegatevvoda::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
{

    QLineEdit *LineEdit = new QLineEdit(parent);
    connect(LineEdit, SIGNAL(textChanged(QString)), this,
           SLOT(resizeLineEditToContents()));
    LineEdit->setMaxLength(50);

    return LineEdit;

}

void delegatevvoda::resizeLineEditToContents()
{
    QString text = LineEdit->text();
    QFontMetrics fm = LineEdit->fontMetrics();
    int w = fm.boundingRect(text).width();
    LineEdit->resize(w, LineEdit->height());
}

void delegatevvoda:: setEditorData(QWidget *editor, const QModelIndex &index) const
{

    QString value = index.model()->data(index, Qt::EditRole).toString();
    QLineEdit *LineEdit = qobject_cast<QLineEdit *>(editor);
    LineEdit->setText(value);
   

}

void delegatevvoda:: setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QLineEdit *LineEdit = qobject_cast<QLineEdit *>(editor);
    model->setData(index,LineEdit->text());
    return;
}

в общем пытаюсь отловить изменения с помощью сигнала textChanged и сделать изменение размера ячейки в соответствии с размером текста, однако при попытке ввода в ячейку все падает и вылетает ошибка памяти, не могу разобраться что не так, думаю что проблема в связи сигнала со слотом, однако как ее исправить не могу понять.
Помогите пожалуйста разобраться в проблеме.

« Последнее редактирование: Январь 17, 2013, 21:28 от LEO » Записан
LEO
Гость
« Ответ #14 : Февраль 01, 2013, 16:24 »

Может есть у кого какие идеи по этому поводу, походу перепробовал уже все что можно Непонимающий
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.