【问题标题】:QTextDocument in QAbstractItemDelegate paint methodQAbstractItemDelegate 绘制方法中的 QTextDocument
【发布时间】:2015-05-20 15:53:10
【问题描述】:

我有一个继承QAbstractItemDelegate 的类,我在paint() 方法中使用QTextDocument。我的模型包含两个项目,但是当我运行我的 qt 应用程序时,这些项目被绘制在 QListView 的第一个项目中。

CODE

void ProductItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                const QModelIndex &index) const
{
    bool selected = (option.state & QStyle::State_Selected) == QStyle::State_Selected;

    if (selected)
    {
        painter->fillRect(option.rect, option.palette.highlight());
    }

    painter->save();
    painter->setRenderHint(QPainter::Antialiasing, true);

    if (selected)
    {
        painter->setPen(option.palette.highlightedText().color());
    }
    else
    {
        painter->setPen(option.palette.text().color());
    }

    mTextDocument.drawContents(painter);

    painter->restore();
}

QSize ProductItemDelegate::sizeHint(const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
    MyItem *myItem = index.data(Qt::UserRole + 1).value<MyItem *>();

    mTextDocument->clear();
    mTextDocument->setDefaultFont(option.font);
    mTextDocument->setPageSize(QSizeF(option.rect.width(), -1));

    QTextCursor cursor = QTextCursor(mTextDocument);

    QVector<QTextLength> columnConstraints;
    columnConstraints << QTextLength(QTextLength::PercentageLength, 60);
    columnConstraints << QTextLength(QTextLength::PercentageLength, 30);
    columnConstraints << QTextLength(QTextLength::PercentageLength, 10);

    QTextTableFormat tableFormat;
    tableFormat.setBorder(1);
    tableFormat.setBorderBrush(QBrush(Qt::black));
    tableFormat.setColumnWidthConstraints(columnConstraints);

    QTextTable *table = cursor.insertTable(2, 3, tableFormat);
    table->mergeCells(0, 0, 1, 3);

    QTextCursor cellCursor;

    QTextTableCell cell00 = table->cellAt(0, 0);
    cellCursor = cell00.firstCursorPosition();
    cellCursor.insertText(myItem->name());

    QTextTableCell cell10 = table->cellAt(1, 0);
    cellCursor = cell10.firstCursorPosition();
    cellCursor.insertText(myItem->text1());

    QTextTableCell cell11 = table->cellAt(1, 1);
    cellCursor = cell11.firstCursorPosition();
    cellCursor.insertText(myItem->text2());

    return mTextDocument->size().toSize();
}

这些是上面代码的结果。

该项目未在第二个条目中绘制。

这两个项目都在第一个条目中绘制。

【问题讨论】:

    标签: qt qt5.4 qtextdocument


    【解决方案1】:

    在用它作画之前,你应该把你的画家放在正确的位置。

    在第一个painter-&gt;save()之后添加:

    painter->resetTransform();
    painter->translate(option.rect.topLeft());
    

    【讨论】:

    • 这解决了我的问题。你能解释一下你的答案吗?我查看了关于 QAbstractItemDelegate 的 Qt 文档,但我从未见过这两行代码。
    • 据我了解,QPainter 的初始位置在父级的 topLeft() 处。 (我想象的 TreeView?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多