Читаем QT 4: программирование GUI на С++ полностью

07 QStyleOptionViewItem &option,

08 const QModelIndex &index) const;

09 QWidget *createEditor(QWidget *parent,

10 const QStyleOptionViewItem &option,

11 const QModelIndex &index) const;

12 void setEditorData(QWidget *editor,

13 const QModelIndex &index) const;

14 void setModelData(QWidget *editor,

15 QAbstractItemModel *model,

16 const QModelIndex &index) const;

17 private slots:

18 void commitAndCloseEditor;

19 private:

20 int durationColumn;

21 };

Мы используем QItemDelegate в качестве нашего базового класса, чтобы можно было воспользоваться возможностями делегата по умолчанию. Так же мы могли бы использовать QAbstractItemDelegate, если бы хотели начать с чистого листа. Для обеспечения в делегате возможности редактирования данных мы должны реализовать функции createEditor, setEditorData и setModelData. Кроме того, реализуем функцию paint для изменения отображения столбца длительностей.

01 TrackDelegate::TrackDelegate(int durationColumn, QObject *parent)

02 : QItemDelegate(parent)

03 {

04 this->durationColumn = durationColumn;

05 }

Параметр конструктора durationColumn указывает делегату, какой номер столбца содержит длительность фонограммы.

01 void TrackDelegate::paint(QPainter *painter,

02 const QStyleOptionViewItem &option,

03 const QModelIndex &index) const

04 {

05 if (index.column == durationColumn) {

06 int secs = index.model->data(index, Qt::DisplayRole).toInt;

07 QString text= QString("%1:%2")

08 .arg(secs/60, 2, 10, QChar('0'))

09 .arg(secs % 60, 2, 10, QChar('0'));

10 QStyleOptionViewItem myOption = option;

11 myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;

12 drawDisplay(painter, myOption, myOption.rect, text);

13 drawFocus(painter, myOption, myOption.rect);

14 } else {

15 QItemDelegate::paint(painter, option, index);

16 }

17 }

Поскольку мы собираемся отображать длительность в виде «минуты : секунды», мы переопределили функцию paint. Вызов arg принимает целое число, выводимое в виде строки, допустимое количество символов в строке, основание целого числа (10 для десятичного числа) и символ—заполнитель.

Для выравнивания текста вправо копируем текущие опции стиля и заменяем установленное по умолчанию выравнивание. После этого вызываем QItemDelegate::drawDisplay для вывода текста, затем вызываем QItemDelegate::drawFocus для прорисовки фокусного прямоугольника в том случае, если данный элемент получил фокус, и ничего не делая в противном случае. Функцией drawDisplay очень удобно пользоваться, особенно совместно с нашими собственными опциями стиля. Мы могли бы также рисовать, используя рисовальщик непосредственно.

01 QWidget *TrackDelegate::createEditor(QWidget *parent,

02 const QStyleOptionViewItem &option,

03 const QModelIndex &index) const

04 {

05 if (index.column == durationColumn) {

06 QTimeEdit *timeEdit = new QTimeEdit(parent);

07 timeEdit->setDisplayFormat("mm:ss");

08 connect(timeEdit, SIGNAL(editingFinished),

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже