Добрый день, есть такой вопрос:
надо реализовать нестандартное красивое отображение ячеек таблицы, в один столбец.
Лиха беда начало =) изначально реализовал как QTableWidget + QLabel в качестве виджета отображения =) все получилось, но .... речь идет об объемах данных в сотни тысяч строк.... ессесно это все начало тормозить даже на сотнях записей =(
начал ковырять дальше, получилось что то типа:
tvSheet = new QTableView;
setCentralWidget(tvSheet);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("ad.db");
if(!db.open()){
qDebug() << "Error near DB";
}
model = new QSqlQueryModel();
model->setQuery("SELECT '<b>' || date || '</b>' || text FROM info;");
qDebug() << model->columnCount();
qDebug() << model->rowCount();
tvSheet->setItemDelegate(new HtmlDelegate);
tvSheet->setModel(model);
tvSheet->verticalHeader()->hide();
tvSheet->horizontalHeader()->hide();
tvSheet->resizeColumnsToContents();
tvSheet->resizeRowsToContents();
в итоге получил проблемы с размерами ячейки.
Проблема номер один: при дозагрузке данных из модели некорректно отрабатывает sizeHint ?! Почему ?! то есть для первых 256 строк все отлично. но как только загружается следующая пачка... данные налазят друг надруга и все приехали =( такое ощущение что sizeHint просто не существует для этих записей.
Проблема номер два: хочется сделать отступ в 5 пикселей от каждой стороны виджета. подскажите куда копать ?
код sizeHint:
QTextDocument td;
td.setHtml(index.data(Qt::DisplayRole).toString());
td.setTextWidth(qApp->desktop()->width());
return td.documentLayout()->documentSize().toSize();
а где код делегата.... ??
#include "ViewDelegate.h"
void HtmlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QTextDocument td;
td.setHtml(index.data(Qt::DisplayRole).toString());
// td.setDocumentMargin(10);
td.setTextWidth(painter->window().width());
QAbstractTextDocumentLayout::PaintContext context;
context.palette = option.palette;
painter->save();
QAbstractTextDocumentLayout *layout = td.documentLayout();
painter->translate(0, option.rect.y());
layout->draw(painter, context);
painter->restore();
}
QSize HtmlDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QTextDocument td;
td.setHtml(index.data(Qt::DisplayRole).toString());
td.setTextWidth(qApp->desktop()->width());
return td.documentLayout()->documentSize().toSize();
}
QWidget *HtmlDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QTextEdit *textEdit = new QTextEdit(parent);
return textEdit;
}
void HtmlDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString str = index.data(Qt::DisplayRole).toString();
QTextEdit *textEdit = qobject_cast<QTextEdit*>(editor);
textEdit->setHtml(str);
}
void HtmlDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QTextEdit *textEdit = qobject_cast<QTextEdit*>(editor);
QString str = textEdit->toHtml();
model->setData(index, str, Qt::DisplayRole);
/*
QTextDocument *td = qobject_cast<QTextDocument*>(editor);
QString str = td->toHtml();
model->setData(index, str, Qt::DisplayRole);
*/
}