crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Редактирование в QTableView
AntonH851
  опции профиля:
сообщение 26.5.2010, 11:46
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

Спасибо сказали: 1 раз(а)




Репутация:   0  


Добрый день!
Подскажите пожалуйста, как решить такую проблему:
После того как ячейка отредактирована, редактор закрывается и фокус передается на следующую ячейку, находящуюся справа.
А мне нужно чтобы фокус оставался на той же ячейке которая редактировалась...
Обычно я для этого в делегате пишу такую строку(в методе setModelData):
((QTableView *)this->parent())->setCurrentIndex(index);


Но сейчас она не помогает.
Может быть это связано с тем, что модель унаследована от QAbstractTableModel и я что-то там не дописал...?
Пробовал посылать сигнал closeEditor с параметром QAbstractItemDelegate::EditPreviousItem, но тогда вообще что-то непонятное происходит, фокус-то на месте остается, но делегат не закрывает редактор(или закрывает и тут же открывает).

и пробовал обрабатывать сигнал dataChanged модели, тоже не помогает. Я устанавливаю нужный мне индекс, а потом почему то все время текущий индекс смещается вправо на одни столбец... а где это выключить непонятно...

Как еще такое поведение можно изменить уже не знаю...

Сообщение отредактировал AntonH851 - 26.5.2010, 12:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2010, 12:23
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AntonH851 @ 26.5.2010, 15:46) *
Может быть это связано с тем, что модель унаследована от QAbstractTableModel и я что-то там не дописал...?
нет это связано с делегатом. Это он сигналит, что редактирование завершено и нужно сделать то то.
void QAbstractItemDelegate::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint = NoHint ) [signal]

попробуй установить QStandardItemDelegat, для представления

Цитата(AntonH851 @ 26.5.2010, 15:46) *
Пробовал посылать сигнал closeEditor с параметром QAbstractItemDelegate::EditPreviousItem
делал своего делегата?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 26.5.2010, 12:43
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

Спасибо сказали: 1 раз(а)




Репутация:   0  


Да, сделал делегат, и вроде все написал как обычно.
А если установить QItemDelegate то все работает нормально.
Значит в делегате ошибся.
Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2010, 12:46
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AntonH851 @ 26.5.2010, 16:43) *
Значит в делегате ошибся.
посмотри на параметр, который ты задавал и который идёт по умолчанию
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 26.5.2010, 15:05
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 26.5.2010, 13:46) *
Цитата(AntonH851 @ 26.5.2010, 16:43) *
Значит в делегате ошибся.
посмотри на параметр, который ты задавал и который идёт по умолчанию


мда, придется отказаться от этой затеи...
почему-то и другие делегаты(написанные мною) с этой моделью не хотят дружить...
а стандартный работает нормально.

вот код делегата:
class ReportDataDelegate : public QItemDelegate {
    Q_OBJECT
public:
    ReportDataDelegate(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;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;

public slots:
    void commitAndCloseEditor();

};

ReportDataDelegate::ReportDataDelegate(QObject *parent)
    : QItemDelegate(parent)
{

}

QWidget *ReportDataDelegate::createEditor(QWidget *parent,
                                    const QStyleOptionViewItem &option,
                                    const QModelIndex &index) const
{
    editorType etype;
    if (index.column() == 0 && index.row() > 2) {
        etype = strEdit;
    } else
    if (index.column() > 0 && index.row() == 0) {
        etype = intEdit;
    } else
    if (index.column() > 0 && (index.row() == 1 || index.row() == 2)) {
        etype = strEdit;
    } else
    if (index.column() > 0 && index.row() > 2) {
        etype = dblEdit;
    }
    ReportDataEditor *editor = new ReportDataEditor(etype, parent);
    connect(editor, SIGNAL(Finished()), this, SLOT(commitAndCloseEditor()));
    return editor;
}

void ReportDataDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    ReportDataEditor *ed = qobject_cast<ReportDataEditor *>(editor);
    ed->edit->setText(index.data(Qt::EditRole).toString());
}

void ReportDataDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                 const QModelIndex &index) const
{
    ReportDataEditor *ed = qobject_cast<ReportDataEditor *>(editor);
    model->setData(index, ed->edit->text(), Qt::EditRole);
    ((QTableView *)this->parent())->setCurrentIndex(index);
}

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

QSize ReportDataDelegate::sizeHint(const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
    QString display_text;
    display_text = index.data(Qt::DisplayRole).toString();
    int width = QFontMetrics(option.font).width(display_text);
    QSize size;
    size.setWidth(width + 40);
    size.setHeight(option.rect.height());
    return size;
}

void ReportDataDelegate::commitAndCloseEditor()
{
    ReportDataEditor *editor = qobject_cast<ReportDataEditor *>(sender());
    emit commitData(editor);
    emit closeEditor(editor, QAbstractItemDelegate::NoHint);
    ((QTableView *)this->parent())->setFocus();
}


Сообщение отредактировал AntonH851 - 26.5.2010, 15:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2010, 15:19
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AntonH851 @ 26.5.2010, 19:05) *
а стандартный работает нормально.
посмотри код QStandardItemDelegat, может имеет смысл унаследоваться от него
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonH851
  опции профиля:
сообщение 26.5.2010, 15:47
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 20.2.2010
Из: Шебекино
Пользователь №: 1475

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 26.5.2010, 16:19) *
Цитата(AntonH851 @ 26.5.2010, 19:05) *
а стандартный работает нормально.
посмотри код QStandardItemDelegat, может имеет смысл унаследоваться от него


а что это за класс такой QStandardItemDelegate?
у меня в Qt такого нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.5.2010, 16:09
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AntonH851 @ 26.5.2010, 19:47) *
а что это за класс такой QStandardItemDelegate?
да, это мне в голову втемяшилось, что это первый наследник абстрактного. Всё-таки он называется - QItemDelegate
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 7.7.2022, 17:08