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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QItemDelegate и установка свойств QLineEdit  (Прочитано 9647 раз)
алексей
Гость
« : Декабрь 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 и как Непонимающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Декабрь 18, 2008, 17:23 »

А может стоит попробывать переопередлить editorEvent, споймать ShowEvent, а затем дернуть setCursorPosition(0)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
алексей
Гость
« Ответ #2 : Декабрь 18, 2008, 17:30 »

А может стоит попробывать переопередлить editorEvent, споймать ShowEvent, а затем дернуть setCursorPosition(0)

А как в делегате для QLineEdit это сделать, или я что не понимаю....
« Последнее редактирование: Декабрь 18, 2008, 17:33 от алексей » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Декабрь 18, 2008, 18:07 »

Также само как вы перегрузили createEditor, setEditorData, updateEditorGeometry и др.

См. QAbstractItemDelegate::editorEvent
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
алексей
Гость
« Ответ #4 : Декабрь 19, 2008, 09:48 »

Также само как вы перегрузили createEditor, setEditorData, updateEditorGeometry и др.

См. QAbstractItemDelegate::editorEvent
Спасибо... буду пробовать !!!!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Декабрь 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);
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
алексей
Гость
« Ответ #6 : Декабрь 22, 2008, 09:13 »

Да, вышепреведенный код работает... огромное спасибо !!!
Записан
TaIRou
Гость
« Ответ #7 : Сентябрь 21, 2011, 19:30 »

Ребят, дабы новую тему не создавать, спрошу здесь.

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Сентябрь 21, 2011, 19:54 »

"целый класс" в данном случае - это около десятка строчек кода, зато это корректно и читабельность будет лучше
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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