Add fontInfo property to Text

This provides a way to determine which font will actually be
used to presenting the text, which can be especially useful when
not using a fixed size font (the font info will then expose the
actual font size used by the Text element.)

[ChangeLog][QtQuick][Text] Added fontInfo property to Text type,
providing a way to query properties of the actual font used
for presenting the text.

Task-number: QTBUG-51133
Change-Id: I5860fb1bd25ac5734713f49c8482428f2d531d22
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Robin Burchell <robin.burchell@crimson.no>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2017-01-30 20:09:23 +01:00
parent 9500615569
commit 659d5202f9
5 changed files with 137 additions and 1 deletions

View File

@ -74,7 +74,7 @@ Q_DECLARE_LOGGING_CATEGORY(DBG_HOVER_TRACE)
const QChar QQuickTextPrivate::elideChar = QChar(0x2026);
QQuickTextPrivate::QQuickTextPrivate()
: elideLayout(0), textLine(0), lineWidth(0)
: fontInfo(font), elideLayout(0), textLine(0), lineWidth(0)
, color(0xFF000000), linkColor(0xFF0000FF), styleColor(0xFF000000)
, lineCount(1), multilengthEos(-1)
, elideMode(QQuickText::ElideNone), hAlign(QQuickText::AlignLeft), vAlign(QQuickText::AlignTop)
@ -1018,6 +1018,17 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const baseline)
implicitWidthValid = true;
implicitHeightValid = true;
QFontInfo scaledFontInfo(scaledFont);
if (fontInfo.weight() != scaledFontInfo.weight()
|| fontInfo.pixelSize() != scaledFontInfo.pixelSize()
|| fontInfo.italic() != scaledFontInfo.italic()
|| !qFuzzyCompare(fontInfo.pointSizeF(), scaledFontInfo.pointSizeF())
|| fontInfo.family() != scaledFontInfo.family()
|| fontInfo.styleName() != scaledFontInfo.styleName()) {
fontInfo = scaledFontInfo;
emit q->fontInfoChanged();
}
if (eos != multilengthEos)
truncated = true;
@ -2974,4 +2985,80 @@ void QQuickText::resetBottomPadding()
d->setBottomPadding(0, true);
}
/*!
\qmlproperty string QtQuick::Text::fontInfo.family
\since 5.9
The family name of the font that has been resolved for the current font
and fontSizeMode.
*/
/*!
\qmlproperty string QtQuick::Text::fontInfo.styleName
\since 5.9
The style name of the font info that has been resolved for the current font
and fontSizeMode.
*/
/*!
\qmlproperty bool QtQuick::Text::fontInfo.bold
\since 5.9
The bold state of the font info that has been resolved for the current font
and fontSizeMode. This is true if the weight of the resolved font is bold or higher.
*/
/*!
\qmlproperty int QtQuick::Text::fontInfo.weight
\since 5.9
The weight of the font info that has been resolved for the current font
and fontSizeMode.
*/
/*!
\qmlproperty bool QtQuick::Text::fontInfo.italic
\since 5.9
The italic state of the font info that has been resolved for the current font
and fontSizeMode.
*/
/*!
\qmlproperty real QtQuick::Text::fontInfo.pointSize
\since 5.9
The pointSize of the font info that has been resolved for the current font
and fontSizeMode.
*/
/*!
\qmlproperty string QtQuick::Text::fontInfo.pixelSize
\since 5.9
The pixel size of the font info that has been resolved for the current font
and fontSizeMode.
*/
QJSValue QQuickText::fontInfo() const
{
Q_D(const QQuickText);
QJSEngine *engine = qjsEngine(this);
if (!engine) {
qmlWarning(this) << "fontInfo: item has no JS engine";
return QJSValue();
}
QJSValue value = engine->newObject();
value.setProperty(QStringLiteral("family"), d->fontInfo.family());
value.setProperty(QStringLiteral("styleName"), d->fontInfo.styleName());
value.setProperty(QStringLiteral("bold"), d->fontInfo.bold());
value.setProperty(QStringLiteral("weight"), d->fontInfo.weight());
value.setProperty(QStringLiteral("italic"), d->fontInfo.italic());
value.setProperty(QStringLiteral("pointSize"), d->fontInfo.pointSizeF());
value.setProperty(QStringLiteral("pixelSize"), d->fontInfo.pixelSize());
return value;
}
QT_END_NAMESPACE

View File

@ -98,6 +98,8 @@ class Q_QUICK_PRIVATE_EXPORT QQuickText : public QQuickImplicitSizeItem
Q_PROPERTY(qreal rightPadding READ rightPadding WRITE setRightPadding RESET resetRightPadding NOTIFY rightPaddingChanged REVISION 6)
Q_PROPERTY(qreal bottomPadding READ bottomPadding WRITE setBottomPadding RESET resetBottomPadding NOTIFY bottomPaddingChanged REVISION 6)
Q_PROPERTY(QJSValue fontInfo READ fontInfo NOTIFY fontInfoChanged REVISION 9)
public:
QQuickText(QQuickItem *parent=0);
~QQuickText();
@ -248,6 +250,8 @@ public:
void setBottomPadding(qreal padding);
void resetBottomPadding();
QJSValue fontInfo() const;
Q_SIGNALS:
void textChanged(const QString &text);
void linkActivated(const QString &link);
@ -280,6 +284,7 @@ Q_SIGNALS:
Q_REVISION(6) void leftPaddingChanged();
Q_REVISION(6) void rightPaddingChanged();
Q_REVISION(6) void bottomPaddingChanged();
Q_REVISION(9) void fontInfoChanged();
protected:
QQuickText(QQuickTextPrivate &dd, QQuickItem *parent = 0);

View File

@ -122,6 +122,7 @@ public:
QString text;
QFont font;
QFont sourceFont;
QFontInfo fontInfo;
QTextLayout layout;
QTextLayout *elideLayout;

View File

@ -0,0 +1,24 @@
import QtQuick 2.9
Item {
Text {
id: main
objectName: "main"
width: 500
height: 500
text: "Meaningless text"
font.pixelSize: 1000
fontSizeMode: Text.Fit
}
Text {
objectName: "copy"
text: main.text
width: main.width
height: main.height
font.family: main.fontInfo.family
font.pixelSize: main.fontInfo.pixelSize
}
}

View File

@ -154,6 +154,8 @@ private slots:
void hAlignWidthDependsOnImplicitWidth_data();
void hAlignWidthDependsOnImplicitWidth();
void fontInfo();
private:
QStringList standard;
QStringList richText;
@ -4253,6 +4255,23 @@ void tst_qquicktext::hAlignWidthDependsOnImplicitWidth()
QCOMPARE(numberOfNonWhitePixels(0, rectX - 1, image), 0);
}
void tst_qquicktext::fontInfo()
{
QQmlComponent component(&engine, testFile("fontInfo.qml"));
QScopedPointer<QObject> object(component.create());
QObject *root = object.data();
QQuickText *main = root->findChild<QQuickText *>("main");
QVERIFY(main);
QCOMPARE(main->font().pixelSize(), 1000);
QQuickText *copy = root->findChild<QQuickText *>("copy");
QVERIFY(copy);
QCOMPARE(copy->font().family(), QFontInfo(QFont()).family());
QVERIFY(copy->font().pixelSize() < 1000);
}
QTEST_MAIN(tst_qquicktext)
#include "tst_qquicktext.moc"