QTextDocument: add setLayoutEnabled()
This allows to set up everything first - without paying for layouting at every step - and only then trigger layouting. Same performance behavior as setTextWidth(0), but this is a more explicit/readable API. Change-Id: I044dbd8b1301b1c97a92f9a29ccde2baf27a7665 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
e5a5c099af
commit
1e938c348b
@ -634,6 +634,41 @@ bool QTextDocument::useDesignMetrics() const
|
|||||||
return d->defaultTextOption.useDesignMetrics();
|
return d->defaultTextOption.useDesignMetrics();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\property QTextDocument::layoutEnabled
|
||||||
|
\since 6.4
|
||||||
|
\brief whether QTextDocument should recalculate the layout after every change
|
||||||
|
|
||||||
|
If this property is set to true, any change triggers a laying out of the
|
||||||
|
document, which makes everything work as expected, but takes time.
|
||||||
|
|
||||||
|
Temporarily disabling the layout process can save time when making multiple changes
|
||||||
|
(not just text content, but also default font, default text option....)
|
||||||
|
so that the document is only laid out once in the end. This can be useful when the
|
||||||
|
text width or page size isn't yet known, for instance.
|
||||||
|
|
||||||
|
By default, this property is \c true.
|
||||||
|
|
||||||
|
\sa setTextWidth
|
||||||
|
*/
|
||||||
|
|
||||||
|
void QTextDocument::setLayoutEnabled(bool b)
|
||||||
|
{
|
||||||
|
Q_D(QTextDocument);
|
||||||
|
if (d->layoutEnabled == b)
|
||||||
|
return;
|
||||||
|
d->layoutEnabled = b;
|
||||||
|
if (b && d->lout)
|
||||||
|
d->lout->documentChanged(0, 0, d->length());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTextDocument::isLayoutEnabled() const
|
||||||
|
{
|
||||||
|
Q_D(const QTextDocument);
|
||||||
|
return d->layoutEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\since 4.2
|
\since 4.2
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ class Q_GUI_EXPORT QTextDocument : public QObject
|
|||||||
Q_PROPERTY(QSizeF pageSize READ pageSize WRITE setPageSize)
|
Q_PROPERTY(QSizeF pageSize READ pageSize WRITE setPageSize)
|
||||||
Q_PROPERTY(QFont defaultFont READ defaultFont WRITE setDefaultFont)
|
Q_PROPERTY(QFont defaultFont READ defaultFont WRITE setDefaultFont)
|
||||||
Q_PROPERTY(bool useDesignMetrics READ useDesignMetrics WRITE setUseDesignMetrics)
|
Q_PROPERTY(bool useDesignMetrics READ useDesignMetrics WRITE setUseDesignMetrics)
|
||||||
|
Q_PROPERTY(bool layoutEnabled READ isLayoutEnabled WRITE setLayoutEnabled)
|
||||||
Q_PROPERTY(QSizeF size READ size)
|
Q_PROPERTY(QSizeF size READ size)
|
||||||
Q_PROPERTY(qreal textWidth READ textWidth WRITE setTextWidth)
|
Q_PROPERTY(qreal textWidth READ textWidth WRITE setTextWidth)
|
||||||
Q_PROPERTY(int blockCount READ blockCount)
|
Q_PROPERTY(int blockCount READ blockCount)
|
||||||
@ -218,6 +219,9 @@ public:
|
|||||||
void setUseDesignMetrics(bool b);
|
void setUseDesignMetrics(bool b);
|
||||||
bool useDesignMetrics() const;
|
bool useDesignMetrics() const;
|
||||||
|
|
||||||
|
void setLayoutEnabled(bool b);
|
||||||
|
bool isLayoutEnabled() const;
|
||||||
|
|
||||||
void drawContents(QPainter *painter, const QRectF &rect = QRectF());
|
void drawContents(QPainter *painter, const QRectF &rect = QRectF());
|
||||||
|
|
||||||
void setTextWidth(qreal width);
|
void setTextWidth(qreal width);
|
||||||
|
@ -294,7 +294,7 @@ public:
|
|||||||
// Only test the width for 0:
|
// Only test the width for 0:
|
||||||
// * setTextWidth(x) leads to height -1, which is valid
|
// * setTextWidth(x) leads to height -1, which is valid
|
||||||
// * the default page size of (-1, -1) means size determined from contents, this is valid too
|
// * the default page size of (-1, -1) means size determined from contents, this is valid too
|
||||||
bool canLayout() const { return !qIsNull(pageSize.width()); }
|
bool canLayout() const { return layoutEnabled && !qIsNull(pageSize.width()); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTextDocumentPrivate(const QTextDocumentPrivate& m);
|
QTextDocumentPrivate(const QTextDocumentPrivate& m);
|
||||||
@ -342,6 +342,7 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
bool inContentsChange;
|
bool inContentsChange;
|
||||||
|
bool layoutEnabled = true;
|
||||||
QTextOption defaultTextOption;
|
QTextOption defaultTextOption;
|
||||||
Qt::CursorMoveStyle defaultCursorMoveStyle;
|
Qt::CursorMoveStyle defaultCursorMoveStyle;
|
||||||
#ifndef QT_NO_CSSPARSER
|
#ifndef QT_NO_CSSPARSER
|
||||||
|
@ -35,6 +35,7 @@ private slots:
|
|||||||
void translate();
|
void translate();
|
||||||
void createTextItem();
|
void createTextItem();
|
||||||
void createTextItemZeroWidth();
|
void createTextItemZeroWidth();
|
||||||
|
void createTextItemNoLayouting();
|
||||||
};
|
};
|
||||||
|
|
||||||
tst_QGraphicsItem::tst_QGraphicsItem()
|
tst_QGraphicsItem::tst_QGraphicsItem()
|
||||||
@ -235,5 +236,22 @@ void tst_QGraphicsItem::createTextItemZeroWidth()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QGraphicsItem::createTextItemNoLayouting()
|
||||||
|
{
|
||||||
|
// Ensure QFontDatabase loaded the font beforehand
|
||||||
|
QFontInfo(qApp->font()).family();
|
||||||
|
const QString text = "This is some text";
|
||||||
|
QBENCHMARK {
|
||||||
|
QGraphicsTextItem item;
|
||||||
|
item.document()->setLayoutEnabled(false);
|
||||||
|
// Prepare everything
|
||||||
|
item.setPlainText(text);
|
||||||
|
QTextOption option = item.document()->defaultTextOption();
|
||||||
|
option.setAlignment(Qt::AlignHCenter);
|
||||||
|
item.document()->setDefaultTextOption(option);
|
||||||
|
// And (in a real app) enable layouting here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QGraphicsItem)
|
QTEST_MAIN(tst_QGraphicsItem)
|
||||||
#include "tst_qgraphicsitem.moc"
|
#include "tst_qgraphicsitem.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user