Russian Qt Forum

Qt => Model-View (MV) => Тема начата: dezconnect от Ноябрь 01, 2010, 21:33



Название: QTableView + QSqlQueryModel + QItemDelegate
Отправлено: dezconnect от Ноябрь 01, 2010, 21:33
Добрый день, есть такой вопрос:

надо реализовать нестандартное красивое отображение ячеек таблицы, в один столбец.

Лиха беда начало =) изначально реализовал как 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();


Название: Re: QTableView + QSqlQueryModel + QItemDelegate
Отправлено: crossly от Ноябрь 01, 2010, 22:41
а где код делегата.... ??


Название: Re: QTableView + QSqlQueryModel + QItemDelegate
Отправлено: dezconnect от Ноябрь 04, 2010, 14:09
Код:
#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);
    */
}