summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2011-09-18 23:17:54 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2011-09-18 23:17:54 (GMT)
commit7c7c4fefd242bba7947306656fb7163512b86da5 (patch)
tree96a4e29bdc733f39c9bd63a4474ee1ac319d46c5
parent492054b9b78287122cb2a56dd39b7dd843075d02 (diff)
parenta27b646bff215301d9218c18d7eb330e1ed1e60a (diff)
downloadQt-7c7c4fefd242bba7947306656fb7163512b86da5.zip
Qt-7c7c4fefd242bba7947306656fb7163512b86da5.tar.gz
Qt-7c7c4fefd242bba7947306656fb7163512b86da5.tar.bz2
Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qt-water-team
* 'master' of git://scm.dev.nokia.troll.no/qt/qt-water-team: QGraphicsWidget::setLayoutDirection doesn't propagate to new children Prevent unnecessary graphics item updates when graphics effect changes. Use more widely supported Unicode character representation Release font engine refcount when done using it in QTextEngine Fix - QGraphicsTextItem in a tab of QTabWidget cannot get focus Updated Changelog Do not put cursor at non-stop character positions doc: Fix incorrect enum name in QRawFont::alphaMapForGlyph docs
-rw-r--r--dist/changes-4.8.08
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp36
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicswidget.cpp6
-rw-r--r--src/gui/text/qrawfont.cpp3
-rw-r--r--src/gui/text/qtextengine_p.h1
-rw-r--r--src/gui/text/qtextlayout.cpp3
-rw-r--r--tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp95
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp68
-rw-r--r--tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp53
-rw-r--r--tests/auto/qtextlayout/tst_qtextlayout.cpp19
11 files changed, 271 insertions, 25 deletions
diff --git a/dist/changes-4.8.0 b/dist/changes-4.8.0
index 2d46a26..d094b38 100644
--- a/dist/changes-4.8.0
+++ b/dist/changes-4.8.0
@@ -58,6 +58,7 @@ QtCore
- QUrl: add method for retrieving effective top level domain [QTBUG-13601] (MR-1205)
- optimised performance of QFileInfo, QDir, QDirIterator, these classes now share metadata and access the filesystem less
- QFile: new open() overloads allow control over whether QFile should close an adopted file handle or not
+ - QLocale: added locale dependent to{Upper,Lower} string conversions
QtGui
-----
@@ -77,6 +78,8 @@ QtGui
like UltraLight. [QTBUG-19366]
- Visual text cursor movement behavior is added to QTextEdit and QLineEdit controls,
which can be used as an optional mode for bi-directional text editing. [QTBUG-13859]
+ - QPainter: Added a fast stroking algorithm for thin (< 1px wide) aliased and antialiased
+ lines, giving a huge improvement in drawing speed for certain cases
- Fixed a rare race condition when showing toplevel windows on X11
- Accessibility: Fix potential crash in QDockWidget.
- Accessibility: Fix crash when asking for relations of child accessibles.
@@ -119,9 +122,12 @@ QtScript
--------
- Deprecated qScriptValueFromQMetaObject, qScriptValueToValue, qScriptValueFromValue
+QtDBus
+------
+ - Added a method that returns the local machine ID
+
QtSql
-----
-
- Update sqlite to 3.7.7.1
****************************************************************************
* Database Drivers *
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 0c218fc..9092593 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -5378,11 +5378,9 @@ void QGraphicsItemPrivate::invalidateParentGraphicsEffectsRecursively()
{
QGraphicsItemPrivate *itemPrivate = this;
do {
- if (itemPrivate->graphicsEffect) {
+ if (itemPrivate->graphicsEffect && !itemPrivate->updateDueToGraphicsEffect) {
itemPrivate->notifyInvalidated = 1;
-
- if (!itemPrivate->updateDueToGraphicsEffect)
- static_cast<QGraphicsItemEffectSourcePrivate *>(itemPrivate->graphicsEffect->d_func()->source->d_func())->invalidateCache();
+ static_cast<QGraphicsItemEffectSourcePrivate *>(itemPrivate->graphicsEffect->d_func()->source->d_func())->invalidateCache();
}
} while ((itemPrivate = itemPrivate->parent ? itemPrivate->parent->d_ptr.data() : 0));
}
@@ -5690,21 +5688,27 @@ void QGraphicsItem::update(const QRectF &rect)
d_ptr->invalidateParentGraphicsEffectsRecursively();
#endif //QT_NO_GRAPHICSEFFECT
- if (CacheMode(d_ptr->cacheMode) != NoCache) {
- // Invalidate cache.
- QGraphicsItemCache *cache = d_ptr->extraItemCache();
- if (!cache->allExposed) {
- if (rect.isNull()) {
- cache->allExposed = true;
- cache->exposed.clear();
- } else {
- cache->exposed.append(rect);
+#ifndef QT_NO_GRAPHICSEFFECT
+ if (!d_ptr->updateDueToGraphicsEffect) {
+#endif
+ if (CacheMode(d_ptr->cacheMode) != NoCache) {
+ // Invalidate cache.
+ QGraphicsItemCache *cache = d_ptr->extraItemCache();
+ if (!cache->allExposed) {
+ if (rect.isNull()) {
+ cache->allExposed = true;
+ cache->exposed.clear();
+ } else {
+ cache->exposed.append(rect);
+ }
}
+ // Only invalidate cache; item is already dirty.
+ if (d_ptr->fullUpdatePending)
+ return;
}
- // Only invalidate cache; item is already dirty.
- if (d_ptr->fullUpdatePending)
- return;
+#ifndef QT_NO_GRAPHICSEFFECT
}
+#endif
if (d_ptr->scene)
d_ptr->scene->d_func()->markDirty(this, rect);
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 1551944..867880c 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -3504,7 +3504,9 @@ bool QGraphicsScene::event(QEvent *event)
}
break;
case QEvent::WindowDeactivate:
- if (!--d->activationRefCount) {
+ if (d->activationRefCount > 0)
+ --d->activationRefCount;
+ if (!d->activationRefCount) {
if (d->activePanel) {
// Deactivate the active panel (but keep it so we can
// reactivate it later).
diff --git a/src/gui/graphicsview/qgraphicswidget.cpp b/src/gui/graphicsview/qgraphicswidget.cpp
index b16e51e..c275968 100644
--- a/src/gui/graphicsview/qgraphicswidget.cpp
+++ b/src/gui/graphicsview/qgraphicswidget.cpp
@@ -1173,6 +1173,12 @@ QVariant QGraphicsWidget::itemChange(GraphicsItemChange change, const QVariant &
QApplication::sendEvent(this, &event);
break;
}
+ case ItemChildAddedChange: {
+ QGraphicsItem *child = qVariantValue<QGraphicsItem *>(value);
+ if (child->isWidget())
+ static_cast<QGraphicsWidget *>(child)->d_func()->resolveLayoutDirection();
+ break;
+ }
default:
break;
}
diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp
index 61bc63e..7c7d4eb 100644
--- a/src/gui/text/qrawfont.cpp
+++ b/src/gui/text/qrawfont.cpp
@@ -238,7 +238,8 @@ void QRawFont::loadFromData(const QByteArray &fontData,
If \a antialiasingType is set to QRawFont::SubPixelAntialiasing, then the resulting image will be
in QImage::Format_RGB32 and the RGB values of each pixel will represent the subpixel opacities of
the pixel in the rasterization of the glyph. Otherwise, the image will be in the format of
- QImage::Format_A8 and each pixel will contain the opacity of the pixel in the rasterization.
+ QImage::Format_Indexed8 and each pixel will contain the opacity of the pixel in the
+ rasterization.
\sa pathForGlyph(), QPainter::drawGlyphRun()
*/
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
index 067e81d..9362022 100644
--- a/src/gui/text/qtextengine_p.h
+++ b/src/gui/text/qtextengine_p.h
@@ -629,7 +629,6 @@ public:
int lineNumberForTextPosition(int pos);
int positionAfterVisualMovement(int oldPos, QTextCursor::MoveOperation op);
void insertionPointsForLine(int lineNum, QVector<int> &insertionPoints);
-
void resetFontEngineCache();
private:
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index 83c3676..d0c1a0e 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -2507,6 +2507,9 @@ qreal QTextLine::cursorToX(int *cursorPos, Edge edge) const
int pos = *cursorPos;
int itm;
+ const HB_CharAttributes *attributes = eng->attributes();
+ while (pos < line.from + line.length && !attributes[pos].charStop)
+ pos++;
if (pos == line.from + (int)line.length) {
// end of line ensure we have the last item on the line
itm = eng->findItem(pos-1);
diff --git a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
index 1f5563c..9c189cb 100644
--- a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
+++ b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
@@ -78,6 +78,8 @@ private slots:
void dropShadowClipping();
void childrenVisibilityShouldInvalidateCache();
void prepareGeometryChangeInvalidateCache();
+ void graphicsEffectUpdateShouldNotInvalidateGraphicsItemCache();
+ void graphicsEffectUpdateShouldInvalidateParentGraphicsEffect();
void itemHasNoContents();
};
@@ -732,6 +734,99 @@ void tst_QGraphicsEffect::prepareGeometryChangeInvalidateCache()
QCOMPARE(item->nbPaint, 0);
}
+class MyGraphicsEffect : public QGraphicsEffect
+{
+ public:
+ MyGraphicsEffect(QObject *parent = 0) :
+ QGraphicsEffect(parent), nbSourceInvalidations(0)
+ {}
+ int nbSourceInvalidations;
+ protected:
+ void draw(QPainter *painter)
+ {
+ drawSource(painter);
+ }
+
+ void sourceChanged(ChangeFlags flags)
+ {
+ if (flags == SourceInvalidated)
+ nbSourceInvalidations++;
+ }
+};
+
+void tst_QGraphicsEffect::graphicsEffectUpdateShouldNotInvalidateGraphicsItemCache()
+{
+ QGraphicsScene scene;
+ MyGraphicsItem parent;
+ parent.resize(200, 200);
+ parent.setCacheMode(QGraphicsItem::ItemCoordinateCache);
+ scene.addItem(&parent);
+
+ QGraphicsView view(&scene);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ QTRY_COMPARE(parent.nbPaint, 1);
+
+ //we set an effect on the parent
+ MyGraphicsEffect* opacityEffect = new MyGraphicsEffect(&parent);
+ opacityEffect->update();
+ parent.setGraphicsEffect(opacityEffect);
+ //flush the events
+ QApplication::processEvents();
+ //new effect applied->repaint
+ QCOMPARE(parent.nbPaint, 1);
+
+ opacityEffect->update();
+ //flush the events
+ QApplication::processEvents();
+ //A change to the effect shouldn't invalidate the graphicsitem's cache
+ // => it shouldn't trigger a paint
+ QCOMPARE(parent.nbPaint, 1);
+}
+
+void tst_QGraphicsEffect::graphicsEffectUpdateShouldInvalidateParentGraphicsEffect()
+{
+ QGraphicsScene scene;
+ // Add the parent
+ MyGraphicsItem parent;
+ parent.resize(200, 200);
+ scene.addItem(&parent);
+ // Add a child to the parent
+ MyGraphicsItem child(&parent);
+ child.resize(100, 100);
+
+ QGraphicsView view(&scene);
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ //flush the events
+ QApplication::processEvents();
+ QTRY_COMPARE(parent.nbPaint, 1);
+ QTRY_COMPARE(child.nbPaint, 1);
+
+ //we set an effect on the parent and the child
+ MyGraphicsEffect* effectForParent = new MyGraphicsEffect(&parent);
+ parent.setGraphicsEffect(effectForParent);
+
+ MyGraphicsEffect* effectForChild = new MyGraphicsEffect(&child);
+ child.setGraphicsEffect(effectForChild);
+ //flush the events
+ QApplication::processEvents();
+ // Both effects should start with no source invalidations
+ QCOMPARE(effectForParent->nbSourceInvalidations, 0);
+ QCOMPARE(effectForChild->nbSourceInvalidations, 0);
+
+ // Trigger an update of the child graphics effect
+ effectForChild->update();
+ //flush the events
+ QApplication::processEvents();
+ // An update of the effect on the child shouldn't tell that effect that its source has been invalidated
+ QCOMPARE(effectForChild->nbSourceInvalidations, 0);
+ // The effect on the parent should however be notified of an invalidated source
+ QCOMPARE(effectForParent->nbSourceInvalidations, 1);
+}
+
void tst_QGraphicsEffect::itemHasNoContents()
{
QGraphicsRectItem *parent = new QGraphicsRectItem;
diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
index b8741fe..8a26323 100644
--- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -290,6 +290,7 @@ private slots:
void taskQT_3674_doNotCrash();
void taskQTBUG_15977_renderWithDeviceCoordinateCache();
void taskQTBUG_16401_focusItem();
+ void taskQTBUG_19680_tabWidgetFocus();
};
void tst_QGraphicsScene::initTestCase()
@@ -4711,5 +4712,72 @@ void tst_QGraphicsScene::taskQTBUG_16401_focusItem()
QVERIFY(!scene.focusItem());
}
+void tst_QGraphicsScene::taskQTBUG_19680_tabWidgetFocus()
+{
+ QTabWidget tabWidget;
+ QGraphicsScene scene1;
+ QGraphicsScene scene2;
+ QGraphicsView view1(&scene1);
+ QGraphicsView view2(&scene2);
+
+ tabWidget.show();
+
+ tabWidget.addTab(&view1, "view1");
+ tabWidget.setCurrentWidget(&view1);
+
+ QGraphicsTextItem *textItem1 = scene1.addText("Text1");
+ textItem1->setFlags(QGraphicsItem::ItemIsFocusable);
+ textItem1->setTextInteractionFlags(Qt::TextEditorInteraction);
+ textItem1->setEnabled(true);
+ textItem1->setFocus();
+
+ tabWidget.addTab(&view2, "view2");
+ tabWidget.setCurrentWidget(&view2);
+
+ QGraphicsTextItem *textItem2 = scene2.addText("Text2");
+ textItem2->setFlags(QGraphicsItem::ItemIsFocusable);
+ textItem2->setTextInteractionFlags(Qt::TextEditorInteraction);
+ textItem2->setEnabled(true);
+ textItem2->setFocus();
+
+ scene2.clearFocus();
+
+ view2.clearFocus();
+ view2.setEnabled(false);
+ view2.setInteractive(false);
+ view2.setVisible(false);
+ view2.setShown(false);
+ view2.hide();
+
+ tabWidget.clearFocus();
+ tabWidget.setEnabled(false);
+ tabWidget.setShown(false);
+ tabWidget.setVisible(false);
+ tabWidget.hide();
+
+ tabWidget.setFocus();
+ tabWidget.setEnabled(true);
+ tabWidget.activateWindow();
+ tabWidget.setShown(true);
+ tabWidget.setVisible(true);
+ tabWidget.show();
+
+ view2.setFocus();
+ view2.setEnabled(true);
+ view2.activateWindow();
+ view2.setInteractive(true);
+ view2.setVisible(true);
+ view2.setShown(true);
+ view2.show();
+
+ QTest::qWaitForWindowShown(&view2);
+ QApplication::setActiveWindow(&tabWidget);
+
+ textItem2->setFocus();
+
+ QVERIFY(scene2.isActive());
+ QVERIFY(textItem2->hasFocus());
+}
+
QTEST_MAIN(tst_QGraphicsScene)
#include "tst_qgraphicsscene.moc"
diff --git a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
index 1df9d38..7b273d2 100644
--- a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -124,6 +124,8 @@ private slots:
void layout();
void layoutDirection_data();
void layoutDirection();
+ void recursiveLayoutDirection_data();
+ void recursiveLayoutDirection();
void paint_data();
void paint();
void palettePropagation();
@@ -1213,14 +1215,20 @@ void tst_QGraphicsWidget::layout()
void tst_QGraphicsWidget::layoutDirection_data()
{
QTest::addColumn<Qt::LayoutDirection>("layoutDirection");
- QTest::newRow("rtl") << Qt::RightToLeft;
- QTest::newRow("ltr") << Qt::LeftToRight;
+ QTest::addColumn<bool>("setDirectionBeforeAddingWidget");
+
+ QTest::newRow("rtl, setting direction before adding widget") << Qt::RightToLeft << true;
+ QTest::newRow("ltr, setting direction before adding widget") << Qt::LeftToRight << true;
+ QTest::newRow("rtl, setting direction after adding widget") << Qt::RightToLeft << false;
+ QTest::newRow("ltr, setting direction after adding widget") << Qt::LeftToRight << false;
+
}
// Qt::LayoutDirection layoutDirection() const public
void tst_QGraphicsWidget::layoutDirection()
{
QFETCH(Qt::LayoutDirection, layoutDirection);
+ QFETCH(bool, setDirectionBeforeAddingWidget);
QGraphicsScene scene;
QGraphicsView *view = new QGraphicsView(&scene);
SubQGraphicsWidget widget;
@@ -1228,13 +1236,16 @@ void tst_QGraphicsWidget::layoutDirection()
QCOMPARE(widget.layoutDirection(), Qt::LeftToRight);
QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), false);
+ if (setDirectionBeforeAddingWidget)
+ widget.setLayoutDirection(layoutDirection);
QList<SubQGraphicsWidget*> children;
for (int i = 0; i < 10; ++i) {
SubQGraphicsWidget *item = new SubQGraphicsWidget(&widget);
children.append(item);
QCOMPARE(item->testAttribute(Qt::WA_SetLayoutDirection), false);
}
- widget.setLayoutDirection(layoutDirection);
+ if (!setDirectionBeforeAddingWidget)
+ widget.setLayoutDirection(layoutDirection);
QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), true);
view->show();
QTest::qWaitForWindowShown(view);
@@ -1247,6 +1258,42 @@ void tst_QGraphicsWidget::layoutDirection()
delete view;
}
+void tst_QGraphicsWidget::recursiveLayoutDirection_data()
+{
+ QTest::addColumn<Qt::LayoutDirection>("layoutDirection");
+ QTest::addColumn<bool>("setDirectionBeforeAddingWidget");
+
+ QTest::newRow("rtl, setting direction before adding widget") << Qt::RightToLeft << true;
+ QTest::newRow("ltr, setting direction before adding widget") << Qt::LeftToRight << true;
+ QTest::newRow("rtl, setting direction after adding widget") << Qt::RightToLeft << false;
+ QTest::newRow("ltr, setting direction after adding widget") << Qt::LeftToRight << false;
+}
+
+void tst_QGraphicsWidget::recursiveLayoutDirection()
+{
+ QFETCH(Qt::LayoutDirection, layoutDirection);
+ QFETCH(bool, setDirectionBeforeAddingWidget);
+ QGraphicsWidget *widget = new QGraphicsWidget;
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(widget);
+ QGraphicsWidget *widget2 = new QGraphicsWidget;
+ QGraphicsLinearLayout *layout2 = new QGraphicsLinearLayout(widget2);
+ QGraphicsWidget *widget3 = new QGraphicsWidget;
+ QGraphicsLinearLayout *layout3 = new QGraphicsLinearLayout(widget3);
+
+ if (setDirectionBeforeAddingWidget)
+ widget->setLayoutDirection(layoutDirection);
+ layout->addItem(widget2);
+ layout2->addItem(widget3);
+ if (!setDirectionBeforeAddingWidget)
+ widget->setLayoutDirection(layoutDirection);
+
+ QCOMPARE(widget->layoutDirection(), layoutDirection);
+ QCOMPARE(widget2->layoutDirection(), layoutDirection);
+ QCOMPARE(widget3->layoutDirection(), layoutDirection);
+
+ delete widget;
+}
+
void tst_QGraphicsWidget::paint_data()
{
// currently QGraphicsWidget doesn't paint or do anything ...
diff --git a/tests/auto/qtextlayout/tst_qtextlayout.cpp b/tests/auto/qtextlayout/tst_qtextlayout.cpp
index 2414ab3..67d8269 100644
--- a/tests/auto/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/qtextlayout/tst_qtextlayout.cpp
@@ -129,6 +129,7 @@ private slots:
void textWidthWithLineSeparator();
void cursorInLigatureWithMultipleLines();
void xToCursorForLigatures();
+ void cursorInNonStopChars();
private:
QFont testFont;
@@ -1465,7 +1466,7 @@ void tst_QTextLayout::textWidthWithLineSeparator()
void tst_QTextLayout::cursorInLigatureWithMultipleLines()
{
#if !defined(Q_WS_MAC)
- QSKIP("This test can not be run on Mac", SkipAll);
+ QSKIP("This test can only be run on Mac", SkipAll);
#endif
QTextLayout layout("first line finish", QFont("Times", 20));
layout.beginLayout();
@@ -1481,7 +1482,7 @@ void tst_QTextLayout::cursorInLigatureWithMultipleLines()
void tst_QTextLayout::xToCursorForLigatures()
{
#if !defined(Q_WS_MAC)
- QSKIP("This test can not be run on Mac", SkipAll);
+ QSKIP("This test can only be run on Mac", SkipAll);
#endif
QTextLayout layout("fi", QFont("Times", 20));
layout.beginLayout();
@@ -1502,5 +1503,19 @@ void tst_QTextLayout::xToCursorForLigatures()
line.xToCursor(width) == line.xToCursor(width / 2));
}
+void tst_QTextLayout::cursorInNonStopChars()
+{
+#if defined(Q_WS_MAC)
+ QSKIP("This test can not be run on Mac", SkipAll);
+#endif
+ QTextLayout layout(QString::fromUtf8("\xE0\xA4\xA4\xE0\xA5\x8D\xE0\xA4\xA8"));
+ layout.beginLayout();
+ QTextLine line = layout.createLine();
+ layout.endLayout();
+
+ QVERIFY(line.cursorToX(1) == line.cursorToX(3));
+ QVERIFY(line.cursorToX(2) == line.cursorToX(3));
+}
+
QTEST_MAIN(tst_QTextLayout)
#include "tst_qtextlayout.moc"