Russian Qt Forum

Qt => Model-View (MV) => Тема начата: алексей от Декабрь 18, 2008, 17:17



Название: QItemDelegate и установка свойств QLineEdit
Отправлено: алексей от Декабрь 18, 2008, 17:17
Здравствуйте !! Есть такая проблема !!!! При редактировании ячейки в QtableView  курсор становиться на последний символ  и выделяет ее - строка растягивается на весь грид, так как длина поля 600 символов, также хотелось бы чтоб курсор устанавливался на начала записи и без выделения. Создал делегата:

Код:
class SimpleDelegate : public QItemDelegate {
public:
SimpleDelegate(QObject* pobj = 0) : QItemDelegate(pobj) { };


QWidget *SimpleDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const
{
QLineEdit *LineEdit = new QLineEdit(parent);
return LineEdit;
}

void SimpleDelegate::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 SimpleDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const
 {

QLineEdit *LineEdit = qobject_cast<QLineEdit*>(editor);
model->setData(index, LineEdit->text());
 }

void SimpleDelegate::updateEditorGeometry(QWidget *editor,
     const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
 {
editor->setGeometry(option.rect);

 }



void paint(QPainter *pPainter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_MouseOver) {
QRect rect = option.rect;
QLinearGradient gradient(0, 0, rect.width(), rect.height());
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(0.5, Qt::blue);
gradient.setColorAt(1, Qt::green);
pPainter->setBrush(gradient);
pPainter->drawRect(rect);
}
QItemDelegate::paint(pPainter, option, index);
}
};


При добавлении кода - LineEdit->setCursorPosition(0) в setEditorData ничего не происходит.
Можно ли создать конструкцию сигнал-слот для LineEdit и как ???


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: pastor от Декабрь 18, 2008, 17:23
А может стоит попробывать переопередлить editorEvent, споймать ShowEvent, а затем дернуть setCursorPosition(0)


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: алексей от Декабрь 18, 2008, 17:30
А может стоит попробывать переопередлить editorEvent, споймать ShowEvent, а затем дернуть setCursorPosition(0)

А как в делегате для QLineEdit это сделать, или я что не понимаю....


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: pastor от Декабрь 18, 2008, 18:07
Также само как вы перегрузили createEditor, setEditorData, updateEditorGeometry и др.

См. QAbstractItemDelegate::editorEvent


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: алексей от Декабрь 19, 2008, 09:48
Также само как вы перегрузили createEditor, setEditorData, updateEditorGeometry и др.

См. QAbstractItemDelegate::editorEvent
Спасибо... буду пробовать !!!!


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: pastor от Декабрь 19, 2008, 16:30
Я немного ошибся, нужно юзать не editorEvent, а eventFilter, вот код, должно работать:

Код
C++ (Qt)
bool SimpleDelegate::eventFilter ( QObject * editor, QEvent * event )
{
   QLineEdit *LineEdit = qobject_cast<QLineEdit*>(editor);
   if (LineEdit && event->type() == QEvent::FocusIn) {
       LineEdit->deselect();
       LineEdit->setCursorPosition(0);
   }
 
   return QItemDelegate::eventFilter(editor, event);
}


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: алексей от Декабрь 22, 2008, 09:13
Да, вышепреведенный код работает... огромное спасибо !!!


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: TaIRou от Сентябрь 21, 2011, 19:30
Ребят, дабы новую тему не создавать, спрошу здесь.

QTableView под наши нужды создает дефолтные делегаты в зависимости от типа данных.
Так вот, реально ли без создания собственного подкласса делегата достучаться до дефолтного делегата?
Суть: необходимо всего лишь сделать lineEdit->setValidator().
Не то чтобы лень... Но целый класс, ради установки валидатора.


Название: Re: QItemDelegate и установка свойств QLineEdit
Отправлено: kambala от Сентябрь 21, 2011, 19:54
"целый класс" в данном случае - это около десятка строчек кода, зато это корректно и читабельность будет лучше