crossplatform.ru

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


  Ответ в Редактирование в QTableView
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 26.5.2010, 16:09
 
Цитата(AntonH851 @ 26.5.2010, 19:47) *
а что это за класс такой QStandardItemDelegate?
да, это мне в голову втемяшилось, что это первый наследник абстрактного. Всё-таки он называется - QItemDelegate
AntonH851 Дата 26.5.2010, 15:47
 
Цитата(Litkevich Yuriy @ 26.5.2010, 16:19) *
Цитата(AntonH851 @ 26.5.2010, 19:05) *
а стандартный работает нормально.
посмотри код QStandardItemDelegat, может имеет смысл унаследоваться от него


а что это за класс такой QStandardItemDelegate?
у меня в Qt такого нет
Litkevich Yuriy Дата 26.5.2010, 15:19
 
Цитата(AntonH851 @ 26.5.2010, 19:05) *
а стандартный работает нормально.
посмотри код QStandardItemDelegat, может имеет смысл унаследоваться от него
AntonH851 Дата 26.5.2010, 15:05
 
Цитата(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();
}
Litkevich Yuriy Дата 26.5.2010, 12:46
 
Цитата(AntonH851 @ 26.5.2010, 16:43) *
Значит в делегате ошибся.
посмотри на параметр, который ты задавал и который идёт по умолчанию
AntonH851 Дата 26.5.2010, 12:43
  Да, сделал делегат, и вроде все написал как обычно.
А если установить QItemDelegate то все работает нормально.
Значит в делегате ошибся.
Спасибо!
Litkevich Yuriy Дата 26.5.2010, 12:23
 
Цитата(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, 11:46
  Добрый день!
Подскажите пожалуйста, как решить такую проблему:
После того как ячейка отредактирована, редактор закрывается и фокус передается на следующую ячейку, находящуюся справа.
А мне нужно чтобы фокус оставался на той же ячейке которая редактировалась...
Обычно я для этого в делегате пишу такую строку(в методе setModelData):
((QTableView *)this->parent())->setCurrentIndex(index);


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

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

Как еще такое поведение можно изменить уже не знаю...
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 12:06