crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Как в ячейке таблице отображать виджет ?, QItemDelegate
flankerr
  опции профиля:
сообщение 19.10.2009, 12:53
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

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




Репутация:   0  


Есть таблица. Надо в ячках вместо стандартной текстовой строки отображать виджет.
На сколько я понимаю тут нужен QItemDelegate. Как подсунуть виджет при редактировании примеров полно. Как отрисовать ячейку с нуля тоже понятно.
А вот как в ячейку в режиме отображения (не редактирования) подсунуть виджет ? И главное чтобы с этим виджетом можно было работать, ну всмысле он был не просто тупо картинкой а полностью рабочим, т.е реагировал на действия пользователя ??

Сообщение отредактировал flankerr - 19.10.2009, 12:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 19.10.2009, 14:36
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


void QAbstractItemView::openPersistentEditor ( const QModelIndex & index )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rnd
  опции профиля:
сообщение 19.10.2009, 15:17
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 54
Регистрация: 22.7.2009
Пользователь №: 930

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




Репутация:   0  


Может быть еще QAbstractItemView::setIndexWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vass
  опции профиля:
сообщение 19.10.2009, 16:30
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 17.3.2009
Из: Россия, Рыбинск
Пользователь №: 617

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




Репутация:   0  


Вот это я вызываю в конструкторе класса наследуемого от QTreeView в своем проекте
setItemDelegateForColumn(progressColumn, new ProgressBarDelegate);


Вот так выглядит заголовок делегата
#include <QtGui/QItemDelegate>
#include <QProgressBar>

class ProgressBarDelegate : public QItemDelegate
{
    Q_OBJECT


public:
    ProgressBarDelegate(QWidget *parent = 0, Qt::Alignment alignment = Qt::AlignCenter) : QItemDelegate(parent), align(alignment) {}

    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const;
    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:
    Qt::Alignment align;
};



Вот так выглядит его реализация:

#include "progressbardelegate.h"

void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                const QModelIndex &index) const
{
    int progress = index.data(Qt::DisplayRole).toInt();

    QStyleOptionProgressBar progressBarOption;
    progressBarOption.rect = option.rect;
    progressBarOption.minimum = 0;
    progressBarOption.maximum = 100;
    progressBarOption.progress = progress;
    if (progress == -1)
    {
        progressBarOption.text = tr("Waiting.");
    }
    else if (progress == -2)
    {
        progressBarOption.text = tr("Pausing.");
    }
    else
    {
        progressBarOption.text = QString::number(progress) + "%";
    }
    progressBarOption.textVisible = true;
    progressBarOption.textAlignment = Qt::AlignHCenter;

    QApplication::style()->drawControl(QStyle::CE_ProgressBar,
                                       &progressBarOption, painter);
}

QWidget *ProgressBarDelegate::createEditor(QWidget *parent,
                                           const QStyleOptionViewItem &/*option */,
                                           const QModelIndex &/*index */) const

{
    QProgressBar *progressBar = new QProgressBar(parent);
    return progressBar;
}

void ProgressBarDelegate::setEditorData(QWidget *editor,
                                        const QModelIndex &index) const
{
    int value = index.data(Qt::DisplayRole).toInt();
    QProgressBar *progressBar = qobject_cast<QProgressBar *>(editor);
    if (value == -1)
    {
        progressBar->setFormat(tr("Waiting."));
        progressBar->setValue(0);
    }
    else if (value == -2)
    {
        progressBar->setFormat(tr("Pausing."));
        progressBar->setValue(0);
    }
    else
    {
        progressBar->setFormat("%p%");
        progressBar->setValue(value);
    }
}

void ProgressBarDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                       const QModelIndex &index) const
{
    QProgressBar *progressBar = qobject_cast<QProgressBar *>(editor);
    QString str = QString::number(progressBar->value());
    model->setData(index, str+"%", Qt::DisplayRole);
}


Вот так оно вызывается из модели (в переопределенной виртуальной ф-ции)
QVariant MyTableModel::data(const QModelIndex &index, int role) const


case progressColumn:
                if (command->state() == CommandInformation::New)
                {
                    return QString("-1");
                }
                else if (command->state() == CommandInformation::Pausing)
                {
                    return QString("-2");
                }
                else
                {
                    return QString::number(command->progress());
                }
                break;


Результатом является вполне функциональный прогрессбар в ячейке (у меня он отображает процент загрузки файла в дайнлоад менеджере)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 19.10.2009, 17:52
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Vass @ 19.10.2009, 17:30) *
QWidget *ProgressBarDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option */, const QModelIndex &/*index */) const { QProgressBar *progressBar = new QProgressBar(parent); return progressBar; }
Цитата(Vass @ 19.10.2009, 17:30) *
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);


Похоже на масло маслянное. Когда ячейка не редактируется, то paintEvent рисует progressBar, кода редактируется (чтО можно редактировать в ячейке, задача которой всего-лишь отображать прогресс?), то поверх нарисованного прогресса создается уже настоящий QProgressBar. Т.е. по сути, в момент редактирования ячейки их 2 должно получиться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.10.2009, 20:13
Сообщение #6


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

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

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




Репутация:   94  


Цитата(SABROG @ 19.10.2009, 21:52) *
Т.е. по сути, в момент редактирования ячейки их 2 должно получиться.
в каждый момент один. По моему так
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 19.10.2009, 21:06
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 19.10.2009, 21:13) *
Цитата(SABROG @ 19.10.2009, 21:52) *
Т.е. по сути, в момент редактирования ячейки их 2 должно получиться.
в каждый момент один. По моему так


Думаю ты прав. Но двойная работу все же присутствует. Остается только понять насколько сильно будет грузить приложение таблица с сотней открытых editoro'в.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.10.2009, 23:23
Сообщение #8


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

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

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




Репутация:   94  


Цитата(SABROG @ 20.10.2009, 1:06) *
Остается только понять насколько сильно будет грузить приложение таблица с сотней открытых editoro'в.
можно посмотреть на моём примерчике (когда-то выкладывал). Вот его поправленный вариант. Прикрепленный файл  Qt_test_7.zip ( 5.41 килобайт ) Кол-во скачиваний: 211

собственно собирайте make debug и в консоли увидите какие методы делегата вызываются.

Делегаты проверяйте в первых двух строчках.

Обратите внимание на вторую строку первого столбца (с редактором даты) во время редактирования. Когда курсор мигает, всё время перерисовывается (вроде логично, но я не ожидал :lol: )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vass
  опции профиля:
сообщение 20.10.2009, 1:14
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 17.3.2009
Из: Россия, Рыбинск
Пользователь №: 617

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




Репутация:   0  


SABROG, Да, признаюсь перестарался :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 5.12.2021, 21:05