| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \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 |
| */ |
| |