From 55f2b448b0aec4e9a8fd3896b2a40f37e939ecb3 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Wed, 8 Feb 2023 08:26:59 +0100 Subject: [PATCH] Turn elidedlabel example into a code snippet The example is 90% boiler plate for subclassing QFrame and providing a bit of GUI to change the size of the label using sliders. The interesting bit is a block of 25 lines of code, so turn those into a snippet and add that to the QTextLayout overview documentation. Fixes: QTBUG-111011 Pick-to: 6.5 Change-Id: I6e97b2ea47b553c8d998ad185cfac006721ef7ee Reviewed-by: Eskil Abrahamsen Blomfeldt --- doc/src/images/elidedlabel-example.png | Bin 24876 -> 0 bytes examples/widgets/doc/src/elidedlabel.qdoc | 131 ------------------ examples/widgets/widgets/CMakeLists.txt | 1 - .../widgets/elidedlabel/CMakeLists.txt | 38 ----- .../widgets/elidedlabel/elidedlabel.cpp | 74 ---------- .../widgets/widgets/elidedlabel/elidedlabel.h | 36 ----- .../widgets/elidedlabel/elidedlabel.pro | 20 --- examples/widgets/widgets/elidedlabel/main.cpp | 16 --- .../widgets/elidedlabel/testwidget.cpp | 119 ---------------- .../widgets/widgets/elidedlabel/testwidget.h | 38 ----- examples/widgets/widgets/widgets.pro | 1 - .../code/src_gui_text_qtextlayout.cpp | 40 +++++- src/gui/text/qtextlayout.cpp | 4 + 13 files changed, 43 insertions(+), 475 deletions(-) delete mode 100644 doc/src/images/elidedlabel-example.png delete mode 100644 examples/widgets/doc/src/elidedlabel.qdoc delete mode 100644 examples/widgets/widgets/elidedlabel/CMakeLists.txt delete mode 100644 examples/widgets/widgets/elidedlabel/elidedlabel.cpp delete mode 100644 examples/widgets/widgets/elidedlabel/elidedlabel.h delete mode 100644 examples/widgets/widgets/elidedlabel/elidedlabel.pro delete mode 100644 examples/widgets/widgets/elidedlabel/main.cpp delete mode 100644 examples/widgets/widgets/elidedlabel/testwidget.cpp delete mode 100644 examples/widgets/widgets/elidedlabel/testwidget.h diff --git a/doc/src/images/elidedlabel-example.png b/doc/src/images/elidedlabel-example.png deleted file mode 100644 index 741d2896e7f41f3892146a4e65bb9e164c353305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24876 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­Ko;Fz8*(3;E{n^ z(9?S4pu`+r3L^jzXGUI_P!}o586yTrEYpIjACb377@kDWVli_uvV5tbBg2uwsl4a9 zaPyj25?ExxqP^5Dbnm(MkE)1CD$mv5XV<^sL9V`9M>~$CEkRf_Wgsg}h2}dt;EN8% z0&j9?33Lm}Ebjt|WtXKE=#0}pdF0l>rSwIi3B3ShoQ4nv;aHaksV@RhEzp&kSONZL zEOhSMf;|MCbrL{=K?s@&XLDYrx}YP=Ty(^R;3*+4y4^p$LEj^y%K&t{8Gv;mgfb=( zSfEY~&^fhqDI)ZsLroXtq90yhL4as;AK-|h%SHZ0Uq1r;9i1WvfuQTZAZWzd4V0Pz z#?Y8?i)1$EpL&wgPIP?L9~dek-Zli z+C^?q+Rr~8edfV`JVU>G+v8ID$lgm4aVo>nQbNB?tS<(s|BoOpIR!69)7*}Mme`R9(2xO))8m3}ppZX!d(Izi0s)w``+*VwUld^2eEyG7 zphtqBiKFNHH;D`X5fLqk5XnE5Q%ippNafKb?fDqs#1DAB;Omc(palYcw;(RW?FFd1 zl+Fc_|FvPDshj#w>d+R6wte)WT^ySmtzUGR&)@p3w1!>U!=uYU#NSf5G~44p57C2| z&o5oVlYi5AX|*(HWfRJ*qx#Z6+9}{r= zH(oJ$F(3b)W?};WshvM&h2{z9J^ diff --git a/examples/widgets/doc/src/elidedlabel.qdoc b/examples/widgets/doc/src/elidedlabel.qdoc deleted file mode 100644 index 5820ddf2b10..00000000000 --- a/examples/widgets/doc/src/elidedlabel.qdoc +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/elidedlabel - \title Elided Label Example - - \brief This example creates a widget similar to QLabel, that elides the last - visible line, if the text is too long to fit the widget's geometry. - - \image elidedlabel-example.png Elided Label example on XPressMusic 5800 - - When text of varying length has to be displayed in a uniformly sized - area, for instance within a list or grid view where all list items have the - same size, it can be useful to give the user a visual clue when not all - text is visible. QLabel can elide text that doesn't fit within it, but only - in one line. The \c ElidedLabel widget shown in this example word wraps its - text by its width, and elides the last visible line if some text is left - out. \c TestWidget gives control to the features of \c ElidedWidget and - forms the example application. - - - \section1 ElidedLabel Class Definition - - Like QLabel, \c ElidedLabel inherits from QFrame. Here's the definition of - the \c ElidedLabel class: - - - \snippet widgets/elidedlabel/elidedlabel.h 0 - - The \c isElided property depends the font, text content and geometry of the - widget. Whenever any of these change, the \c elisionChanged() signal might - trigger. We cache the current elision value in \c elided, so that it - doesn't have to be recomputed every time it's asked for. - - - \section1 ElidedLabel Class Implementation - - Except for initializing the member variables, the constructor sets the size - policy to be horizontally expanding, since it's meant to fill the width of - its container and grow vertically. - - \snippet widgets/elidedlabel/elidedlabel.cpp 0 - - Changing the \c content require a repaint of the widget. - - \snippet widgets/elidedlabel/elidedlabel.cpp 1 - - QTextLayout is used in the \c paintEvent() to divide the \c content into - lines, that wrap on word boundaries. Each line, except the last visible - one, is drawn \c lineSpacing pixels below the previous one. The \c draw() - method of QTextLine will draw the line using the coordinate point as the - top left corner. - - \snippet widgets/elidedlabel/elidedlabel.cpp 2 - - Unfortunately, QTextLayout does not elide text, so the last visible line - has to be treated differently. This last line is elided if it is too wide. - The \c drawText() method of QPainter draws the text starting from the base - line, which is \c ascecnt() pixels below the last drawn line. - - Finally, one more line is created to see if everything fit on this line. - - \snippet widgets/elidedlabel/elidedlabel.cpp 3 - - If the text was elided and wasn't before or vice versa, cache it in - \c elided and emit the change. - - \snippet widgets/elidedlabel/elidedlabel.cpp 4 - - - \section1 TestWidget Class Definition - - \c TestWidget is a QWidget and is the main window of the example. It - contains an \c ElidedLabel which can be resized with two QSlider widgets. - - \snippet widgets/elidedlabel/testwidget.h 0 - - \section1 TestWidget Class Implementation - - The constructor initializes the whole widget. Strings of different length - are stored in \c textSamples. The user is able to switch between these. - - \snippet widgets/elidedlabel/testwidget.cpp 0 - - An \c ElidedLabel is created to contain the first of the sample strings. - The frame is made visible to make it easier to see the actual size of the - widget. - - \snippet widgets/elidedlabel/testwidget.cpp 1 - - The buttons and the elision label are created. By connecting the - \c elisionChanged() signal to the \c setVisible() slot of the \c label, - it will act as an indicator to when the text is elided or not. This signal - could, for instance, be used to make a "More" button visible, or similar. - - \snippet widgets/elidedlabel/testwidget.cpp 2 - - The \c widthSlider and \c heightSlider specify the size of the - \c elidedText. Since the y-axis is inverted, the \c heightSlider has to be - inverted to act appropriately. - - \snippet widgets/elidedlabel/testwidget.cpp 3 - - The components are all stored in a QGridLayout, which is made the layout of - the \c TestWidget. - - \snippet widgets/elidedlabel/testwidget.cpp 4 - - The \c widthSlider and \c heightSlider have the exact same length as the - dimensions of the \c elidedText. The maximum value for both of them is - thus their lengths, and each tick indicates one pixel. - - \snippet widgets/elidedlabel/testwidget.cpp 6 - - The \c switchText() slot simply cycles through all the available sample - texts. - - \snippet widgets/elidedlabel/testwidget.cpp 7 - - These slots set the width and height of the \c elided text, in response to - changes in the sliders. - - \section1 The \c main() Function - - The \c main() function creates an instance of \c TestWidget fullscreen and - enters the message loop. - - \snippet widgets/elidedlabel/main.cpp 0 -*/ - diff --git a/examples/widgets/widgets/CMakeLists.txt b/examples/widgets/widgets/CMakeLists.txt index a5f184880e4..ee90c019b07 100644 --- a/examples/widgets/widgets/CMakeLists.txt +++ b/examples/widgets/widgets/CMakeLists.txt @@ -7,7 +7,6 @@ qt_internal_add_example(calendarwidget) qt_internal_add_example(charactermap) qt_internal_add_example(codeeditor) qt_internal_add_example(digitalclock) -qt_internal_add_example(elidedlabel) qt_internal_add_example(groupbox) qt_internal_add_example(icons) qt_internal_add_example(imageviewer) diff --git a/examples/widgets/widgets/elidedlabel/CMakeLists.txt b/examples/widgets/widgets/elidedlabel/CMakeLists.txt deleted file mode 100644 index 7a53c451623..00000000000 --- a/examples/widgets/widgets/elidedlabel/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(elidedlabel LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/widgets/elidedlabel") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(elidedlabel - elidedlabel.cpp elidedlabel.h - main.cpp - testwidget.cpp testwidget.h -) - -set_target_properties(elidedlabel PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(elidedlabel PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS elidedlabel - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/widgets/elidedlabel/elidedlabel.cpp b/examples/widgets/widgets/elidedlabel/elidedlabel.cpp deleted file mode 100644 index 68ba133811e..00000000000 --- a/examples/widgets/widgets/elidedlabel/elidedlabel.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "elidedlabel.h" - -#include -#include -#include - -//! [0] -ElidedLabel::ElidedLabel(const QString &text, QWidget *parent) - : QFrame(parent) - , elided(false) - , content(text) -{ - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); -} -//! [0] - -//! [1] -void ElidedLabel::setText(const QString &newText) -{ - content = newText; - update(); -} -//! [1] - -//! [2] -void ElidedLabel::paintEvent(QPaintEvent *event) -{ - QFrame::paintEvent(event); - - QPainter painter(this); - QFontMetrics fontMetrics = painter.fontMetrics(); - - bool didElide = false; - int lineSpacing = fontMetrics.lineSpacing(); - int y = 0; - - QTextLayout textLayout(content, painter.font()); - textLayout.beginLayout(); - forever { - QTextLine line = textLayout.createLine(); - - if (!line.isValid()) - break; - - line.setLineWidth(width()); - int nextLineY = y + lineSpacing; - - if (height() >= nextLineY + lineSpacing) { - line.draw(&painter, QPoint(0, y)); - y = nextLineY; - //! [2] - //! [3] - } else { - QString lastLine = content.mid(line.textStart()); - QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width()); - painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine); - line = textLayout.createLine(); - didElide = line.isValid(); - break; - } - } - textLayout.endLayout(); - //! [3] - - //! [4] - if (didElide != elided) { - elided = didElide; - emit elisionChanged(didElide); - } -} -//! [4] diff --git a/examples/widgets/widgets/elidedlabel/elidedlabel.h b/examples/widgets/widgets/elidedlabel/elidedlabel.h deleted file mode 100644 index 342dd5d6a15..00000000000 --- a/examples/widgets/widgets/elidedlabel/elidedlabel.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef ELIDEDLABEL_H -#define ELIDEDLABEL_H - -#include -#include - -//! [0] -class ElidedLabel : public QFrame -{ - Q_OBJECT - Q_PROPERTY(QString text READ text WRITE setText) - Q_PROPERTY(bool isElided READ isElided) - -public: - explicit ElidedLabel(const QString &text, QWidget *parent = nullptr); - - void setText(const QString &text); - const QString & text() const { return content; } - bool isElided() const { return elided; } - -protected: - void paintEvent(QPaintEvent *event) override; - -signals: - void elisionChanged(bool elided); - -private: - bool elided; - QString content; -}; -//! [0] - -#endif // TEXTWRAPPINGWIDGET_H diff --git a/examples/widgets/widgets/elidedlabel/elidedlabel.pro b/examples/widgets/widgets/elidedlabel/elidedlabel.pro deleted file mode 100644 index 34040c92afa..00000000000 --- a/examples/widgets/widgets/elidedlabel/elidedlabel.pro +++ /dev/null @@ -1,20 +0,0 @@ -# Nokia Qt Examples: elided label example - -QT += core gui widgets -requires(qtConfig(combobox)) - -TARGET = elidedlabel -TEMPLATE = app - -SOURCES += \ - main.cpp\ - testwidget.cpp \ - elidedlabel.cpp - -HEADERS += \ - testwidget.h \ - elidedlabel.h - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/widgets/elidedlabel -INSTALLS += target diff --git a/examples/widgets/widgets/elidedlabel/main.cpp b/examples/widgets/widgets/elidedlabel/main.cpp deleted file mode 100644 index 6a1380264ec..00000000000 --- a/examples/widgets/widgets/elidedlabel/main.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "testwidget.h" - -#include - -//! [0] -int main( int argc, char *argv[] ) -{ - QApplication application( argc, argv ); - TestWidget w; - w.showFullScreen(); - return application.exec(); -} -//! [0] diff --git a/examples/widgets/widgets/elidedlabel/testwidget.cpp b/examples/widgets/widgets/elidedlabel/testwidget.cpp deleted file mode 100644 index 72fcd382d3e..00000000000 --- a/examples/widgets/widgets/elidedlabel/testwidget.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "testwidget.h" -#include "elidedlabel.h" - -#include -#include -#include - -//! [0] -TestWidget::TestWidget(QWidget *parent) - : QWidget(parent) -{ - const QString romeo = tr( - "But soft, what light through yonder window breaks? / " - "It is the east, and Juliet is the sun. / " - "Arise, fair sun, and kill the envious moon, / " - "Who is already sick and pale with grief / " - "That thou, her maid, art far more fair than she." - ); - - const QString macbeth = tr( - "To-morrow, and to-morrow, and to-morrow, / " - "Creeps in this petty pace from day to day, / " - "To the last syllable of recorded time; / " - "And all our yesterdays have lighted fools / " - "The way to dusty death. Out, out, brief candle! / " - "Life's but a walking shadow, a poor player, / " - "That struts and frets his hour upon the stage, / " - "And then is heard no more. It is a tale / " - "Told by an idiot, full of sound and fury, / " - "Signifying nothing." - ); - - const QString harry = tr("Feeling lucky, punk?"); - - textSamples << romeo << macbeth << harry; - //! [0] - - //! [1] - sampleIndex = 0; - elidedText = new ElidedLabel(textSamples[sampleIndex], this); - elidedText->setFrameStyle(QFrame::Box); - //! [1] - - //! [2] - QPushButton *switchButton = new QPushButton(tr("Switch text")); - connect(switchButton, &QPushButton::clicked, this, &TestWidget::switchText); - - QPushButton *exitButton = new QPushButton(tr("Exit")); - connect(exitButton, &QPushButton::clicked, this, &TestWidget::close); - - QLabel *label = new QLabel(tr("Elided")); - label->setVisible(elidedText->isElided()); - connect(elidedText, &ElidedLabel::elisionChanged, label, &QLabel::setVisible); - //! [2] - - //! [3] - widthSlider = new QSlider(Qt::Horizontal); - widthSlider->setMinimum(0); - connect(widthSlider, &QSlider::valueChanged, this, &TestWidget::onWidthChanged); - - heightSlider = new QSlider(Qt::Vertical); - heightSlider->setInvertedAppearance(true); - heightSlider->setMinimum(0); - connect(heightSlider, &QSlider::valueChanged, this, &TestWidget::onHeightChanged); - //! [3] - - //! [4] - QGridLayout *layout = new QGridLayout; - layout->addWidget(label, 0, 1, Qt::AlignCenter); - layout->addWidget(switchButton, 0, 2); - layout->addWidget(exitButton, 0, 3); - layout->addWidget(widthSlider, 1, 1, 1, 3); - layout->addWidget(heightSlider, 2, 0); - layout->addWidget(elidedText, 2, 1, 1, 3, Qt::AlignTop | Qt::AlignLeft); - - setLayout(layout); - //! [4] -} - -//! [6] -void TestWidget::resizeEvent(QResizeEvent *event) -{ - Q_UNUSED(event); - - int maxWidth = widthSlider->width(); - widthSlider->setMaximum(maxWidth); - widthSlider->setValue(maxWidth / 2); - - int maxHeight = heightSlider->height(); - heightSlider->setMaximum(maxHeight); - heightSlider->setValue(maxHeight / 2); - - elidedText->setFixedSize(widthSlider->value(), heightSlider->value()); -} -//! [6] - -//! [7] -void TestWidget::switchText() -{ - sampleIndex = (sampleIndex + 1) % textSamples.size(); - elidedText->setText(textSamples.at(sampleIndex)); -} -//! [7] - -//! [8] -void TestWidget::onWidthChanged(int width) -{ - elidedText->setFixedWidth(width); -} - -void TestWidget::onHeightChanged(int height) -{ - elidedText->setFixedHeight(height); -} -//! [8] - diff --git a/examples/widgets/widgets/elidedlabel/testwidget.h b/examples/widgets/widgets/elidedlabel/testwidget.h deleted file mode 100644 index b98250e7601..00000000000 --- a/examples/widgets/widgets/elidedlabel/testwidget.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef TESTWIDGET_H -#define TESTWIDGET_H - -#include -#include -#include - -class ElidedLabel; - -//! [0] -class TestWidget : public QWidget -{ - Q_OBJECT - -public: - TestWidget(QWidget *parent = nullptr); - -protected: - void resizeEvent(QResizeEvent *event) override; - -private slots: - void switchText(); - void onWidthChanged(int width); - void onHeightChanged(int height); - -private: - int sampleIndex; - QStringList textSamples; - ElidedLabel *elidedText; - QSlider *heightSlider; - QSlider *widthSlider; -}; -//! [0] - -#endif // TESTWIDGET_H diff --git a/examples/widgets/widgets/widgets.pro b/examples/widgets/widgets/widgets.pro index 40200295400..1dd736e56fb 100644 --- a/examples/widgets/widgets/widgets.pro +++ b/examples/widgets/widgets/widgets.pro @@ -5,7 +5,6 @@ SUBDIRS = analogclock \ charactermap \ codeeditor \ digitalclock \ - elidedlabel \ groupbox \ icons \ imageviewer \ diff --git a/src/gui/doc/snippets/code/src_gui_text_qtextlayout.cpp b/src/gui/doc/snippets/code/src_gui_text_qtextlayout.cpp index 2602c2ced0e..70ec6b01ea8 100644 --- a/src/gui/doc/snippets/code/src_gui_text_qtextlayout.cpp +++ b/src/gui/doc/snippets/code/src_gui_text_qtextlayout.cpp @@ -10,6 +10,7 @@ namespace src_gui_text_qtextlayout { struct Wrapper : public QPaintDevice { void wrapper1(); + void elided(); }; QTextLayout textLayout; @@ -24,7 +25,7 @@ int leading = fontMetrics.leading(); qreal height = 0; textLayout.setCacheEnabled(true); textLayout.beginLayout(); -while (1) { +while (true) { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; @@ -49,4 +50,41 @@ textLayout.draw(&painter, QPoint(0, 0)); } // Wrapper::wrapper1 +void Wrapper::elided() { + +QString content; + +//! [elided] +QPainter painter(this); +QFontMetrics fontMetrics = painter.fontMetrics(); + +int lineSpacing = fontMetrics.lineSpacing(); +int y = 0; + +QTextLayout textLayout(content, painter.font()); +textLayout.beginLayout(); +while (true) { + QTextLine line = textLayout.createLine(); + + if (!line.isValid()) + break; + + line.setLineWidth(width()); + const int nextLineY = y + lineSpacing; + + if (height() >= nextLineY + lineSpacing) { + line.draw(&painter, QPoint(0, y)); + y = nextLineY; + } else { + const QString lastLine = content.mid(line.textStart()); + const QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width()); + painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine); + line = textLayout.createLine(); + break; + } +} +textLayout.endLayout(); +//! [elided] +} + } // src_gui_text_qtextlayout diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index c6fd99e57cc..752c6180f8d 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -265,6 +265,10 @@ Qt::LayoutDirection QTextInlineObject::textDirection() const The text can then be rendered by calling the layout's draw() function: \snippet code/src_gui_text_qtextlayout.cpp 1 + It is also possible to draw each line individually, for instance to draw + the last line that fits into a widget elided: + \snippet code/src_gui_text_qtextlayout.cpp elided + For a given position in the text you can find a valid cursor position with isValidCursorPosition(), nextCursorPosition(), and previousCursorPosition().