From eef7992181f8b742ae661e489e07b00f25511e55 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Wed, 14 Apr 2010 12:39:12 +0200 Subject: [PATCH] Welcome Screen: Use normal boxed label widgets instead of a tweaked QTreeWidget, making it twice as fast. Acked-by: Daniel Molkentin <daniel.molkentin@nokia.com> Rubber-stamped-by: Jens Bache-Wiig <jens.bache-wiig@nokia.com> --- src/libs/utils/welcomemodetreewidget.cpp | 241 ++++++++++++++---- src/libs/utils/welcomemodetreewidget.h | 23 +- .../projectwelcomepagewidget.ui | 116 --------- .../gettingstartedwelcomepagewidget.ui | 71 +----- .../welcome/communitywelcomepagewidget.ui | 182 +------------ 5 files changed, 205 insertions(+), 428 deletions(-) diff --git a/src/libs/utils/welcomemodetreewidget.cpp b/src/libs/utils/welcomemodetreewidget.cpp index f774d24a5ee..ec60614b7c0 100644 --- a/src/libs/utils/welcomemodetreewidget.cpp +++ b/src/libs/utils/welcomemodetreewidget.cpp @@ -30,9 +30,17 @@ #include "welcomemodetreewidget.h" #include <QtGui/QLabel> +#include <QtGui/QPixmap> #include <QtGui/QAction> -#include <QtGui/QBoxLayout> +#include <QtGui/QVBoxLayout> #include <QtGui/QHeaderView> +#include <QtGui/QMouseEvent> +#include <QtGui/QResizeEvent> + +enum { leftContentsMargin = 2, + topContentsMargin = 2, + bottomContentsMargin = 1, + pixmapWidth = 24 }; namespace Utils { @@ -48,28 +56,185 @@ void WelcomeModeLabel::setStyledText(const QString &text) setText(rc); } +// NewsLabel for the WelcomeModeTreeWidget: +// Shows a news article as "Bold Title!\nElided Start of article...." +// Adapts the eliding when resizing. +class NewsLabel : public QLabel { +public: + explicit NewsLabel(const QString &htmlTitle, + const QString &htmlText, + QWidget *parent = 0); + + virtual void resizeEvent(QResizeEvent *); + +private: + const QString m_title; + const QString m_text; + const int m_minWidth; + + int m_lastWidth; + int m_contentsMargin; +}; + +NewsLabel::NewsLabel(const QString &htmlTitle, + const QString &htmlText, + QWidget *parent) : + QLabel(parent), + m_title(htmlTitle), + m_text(htmlText), + m_minWidth(100), + m_lastWidth(-1) +{ + int dummy, left, right; + getContentsMargins(&left, &dummy, &right, &dummy); + m_contentsMargin = left + right; +} + +void NewsLabel::resizeEvent(QResizeEvent *e) +{ + enum { epsilon = 10 }; + QLabel::resizeEvent(e); + // Resized: Adapt to new size (if it is > m_minWidth) + const int newWidth = qMax(e->size().width() - m_contentsMargin, m_minWidth) - epsilon; + if (newWidth == m_lastWidth) + return; + m_lastWidth = newWidth; + QFont f = font(); + const QString elidedText = QFontMetrics(f).elidedText(m_text, Qt::ElideRight, newWidth); + f.setBold(true); + const QString elidedTitle = QFontMetrics(f).elidedText(m_title, Qt::ElideRight, newWidth); + QString labelText = QLatin1String("<b>"); + labelText += elidedTitle; + labelText += QLatin1String("</b><br /><font color='gray'>"); + labelText += elidedText; + labelText += QLatin1String("</font>"); + setText(labelText); +} + +// Item label of WelcomeModeTreeWidget: Horizontal widget consisting +// of arrow and clickable label. +class WelcomeModeItemWidget : public QWidget { + Q_OBJECT +public: + // Normal items + explicit WelcomeModeItemWidget(const QPixmap &pix, + const QString &text, + const QString &tooltip, + const QString &data, + QWidget *parent = 0); + // News items with title and start of article (see NewsLabel) + explicit WelcomeModeItemWidget(const QPixmap &pix, + QString htmlTitle, + QString htmlText, + const QString &tooltip, + const QString &data, + QWidget *parent = 0); + +signals: + void clicked(const QString &); + +protected: + virtual void mousePressEvent(QMouseEvent *); + +private: + static inline void initLabel(QLabel *); + + void init(const QPixmap &pix, QLabel *itemLabel, const QString &tooltip); + + const QString m_data; +}; + +WelcomeModeItemWidget::WelcomeModeItemWidget(const QPixmap &pix, + const QString &text, + const QString &tooltipText, + const QString &data, + QWidget *parent) : + QWidget(parent), + m_data(data) +{ + QLabel *label = new QLabel(text); + WelcomeModeItemWidget::initLabel(label); + init(pix, label, tooltipText); +} + +static inline void fixHtml(QString &s) +{ + s.replace(QLatin1String("’"), QString(QLatin1Char('\''))); // Quote + s.replace(QLatin1Char('\n'), QLatin1Char(' ')); +} + +WelcomeModeItemWidget::WelcomeModeItemWidget(const QPixmap &pix, + QString title, + QString text, + const QString &tooltipText, + const QString &data, + QWidget *parent) : + QWidget(parent), + m_data(data) +{ + fixHtml(text); + fixHtml(title); + QLabel *newsLabel = new NewsLabel(title, text); + WelcomeModeItemWidget::initLabel(newsLabel); + init(pix, newsLabel, tooltipText); +} + +void WelcomeModeItemWidget::initLabel(QLabel *label) +{ + label->setTextInteractionFlags(Qt::NoTextInteraction); + label->setCursor(QCursor(Qt::PointingHandCursor)); +} + +void WelcomeModeItemWidget::init(const QPixmap &pix, QLabel *itemLabel, + const QString &tooltipText) +{ + QHBoxLayout *hBoxLayout = new QHBoxLayout; + hBoxLayout->setContentsMargins(topContentsMargin, leftContentsMargin, + 0, bottomContentsMargin); + + QLabel *pxLabel = new QLabel; + pxLabel->setPixmap(pix); + pxLabel->setFixedWidth(pixmapWidth); + hBoxLayout->addWidget(pxLabel); + + hBoxLayout->addWidget(itemLabel); + if (!tooltipText.isEmpty()) { + setToolTip(tooltipText); + pxLabel->setToolTip(tooltipText); + itemLabel->setToolTip(tooltipText); + } + setLayout(hBoxLayout); +} + +void WelcomeModeItemWidget::mousePressEvent(QMouseEvent *e) +{ + e->accept(); + emit clicked(m_data); +} + +// ----------------- WelcomeModeTreeWidget struct WelcomeModeTreeWidgetPrivate { WelcomeModeTreeWidgetPrivate(); - const QIcon bullet; + const QPixmap bullet; + QVBoxLayout *layout; + QVBoxLayout *itemLayout; }; WelcomeModeTreeWidgetPrivate::WelcomeModeTreeWidgetPrivate() : - bullet(QLatin1String(":/welcome/images/list_bullet_arrow.png")) + bullet(QLatin1String(":/welcome/images/list_bullet_arrow.png")), + layout(new QVBoxLayout), + itemLayout(new QVBoxLayout) { } WelcomeModeTreeWidget::WelcomeModeTreeWidget(QWidget *parent) : - QTreeWidget(parent), m_d(new WelcomeModeTreeWidgetPrivate) + QWidget(parent), m_d(new WelcomeModeTreeWidgetPrivate) { - connect(this, SIGNAL(itemClicked(QTreeWidgetItem *, int)), - SLOT(slotItemClicked(QTreeWidgetItem *))); - - setUniformRowHeights(true); - viewport()->setAutoFillBackground(false); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setLayout(m_d->layout); + m_d->layout->addLayout(m_d->itemLayout); + m_d->layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding)); } WelcomeModeTreeWidget::~WelcomeModeTreeWidget() @@ -77,55 +242,29 @@ WelcomeModeTreeWidget::~WelcomeModeTreeWidget() delete m_d; } -QSize WelcomeModeTreeWidget::minimumSizeHint() const +void WelcomeModeTreeWidget::addItem(const QString &label, const QString &data, const QString &toolTip) { - return QSize(); + addItemWidget(new WelcomeModeItemWidget(m_d->bullet, label, toolTip, data)); } -QSize WelcomeModeTreeWidget::sizeHint() const +void WelcomeModeTreeWidget::slotAddNewsItem(const QString &title, + const QString &description, + const QString &link) { - return QSize(QTreeWidget::sizeHint().width(), 30 * topLevelItemCount()); + addItemWidget(new WelcomeModeItemWidget(m_d->bullet, title, description, link, link)); } -QTreeWidgetItem *WelcomeModeTreeWidget::addItem(const QString &label, const QString &data, const QString &toolTip) +void WelcomeModeTreeWidget::addItemWidget(WelcomeModeItemWidget *w) { - QTreeWidgetItem *item = new QTreeWidgetItem(this); - item->setIcon(0, m_d->bullet); - item->setSizeHint(0, QSize(24, 30)); - QLabel *lbl = new QLabel(label); - lbl->setTextInteractionFlags(Qt::NoTextInteraction); - lbl->setCursor(QCursor(Qt::PointingHandCursor)); - lbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - QBoxLayout *lay = new QVBoxLayout; - lay->setContentsMargins(3, 2, 0, 0); - lay->addWidget(lbl); - QWidget *wdg = new QWidget; - wdg->setLayout(lay); - setItemWidget(item, 1, wdg); - item->setData(0, Qt::UserRole, data); - if (!toolTip.isEmpty()) - wdg->setToolTip(toolTip); - return item; + connect(w, SIGNAL(clicked(QString)), this, SIGNAL(activated(QString))); + m_d->itemLayout->addWidget(w); } -void WelcomeModeTreeWidget::slotAddNewsItem(const QString &title, const QString &description, const QString &link) +void WelcomeModeTreeWidget::clear() { - const int itemWidth = width()-header()->sectionSize(0); - QFont f = font(); - QString elidedText = QFontMetrics(f).elidedText(description, Qt::ElideRight, itemWidth); - f.setBold(true); - QString elidedTitle = QFontMetrics(f).elidedText(title, Qt::ElideRight, itemWidth); - QString data = QLatin1String("<b>"); - data += elidedTitle; - data += QLatin1String("</b><br /><font color='gray'>"); - data += elidedText; - data += QLatin1String("</font>"); - addTopLevelItem(addItem(data, link, link)); -} - -void WelcomeModeTreeWidget::slotItemClicked(QTreeWidgetItem *item) -{ - emit activated(item->data(0, Qt::UserRole).toString()); + for (int i = m_d->itemLayout->count() - 1; i >= 0; i--) + delete m_d->itemLayout->takeAt(i)->widget(); } +} // namespace Utils -} +#include "welcomemodetreewidget.moc" diff --git a/src/libs/utils/welcomemodetreewidget.h b/src/libs/utils/welcomemodetreewidget.h index 7c13abbe414..082f24ecf87 100644 --- a/src/libs/utils/welcomemodetreewidget.h +++ b/src/libs/utils/welcomemodetreewidget.h @@ -35,10 +35,13 @@ #include <QtGui/QTreeWidget> #include <QtGui/QLabel> +QT_FORWARD_DECLARE_CLASS(QHBoxLayout) + namespace Utils { struct WelcomeModeTreeWidgetPrivate; struct WelcomeModeLabelPrivate; +class WelcomeModeItemWidget; class QTCREATOR_UTILS_EXPORT WelcomeModeLabel : public QLabel { @@ -49,29 +52,25 @@ public: WelcomeModeLabelPrivate *m_d; }; -class QTCREATOR_UTILS_EXPORT WelcomeModeTreeWidget : public QTreeWidget +class QTCREATOR_UTILS_EXPORT WelcomeModeTreeWidget : public QWidget { Q_OBJECT - public: - WelcomeModeTreeWidget(QWidget *parent = 0); - ~WelcomeModeTreeWidget(); - QTreeWidgetItem *addItem(const QString &label, const QString &data,const QString &toolTip = QString::null); + explicit WelcomeModeTreeWidget(QWidget *parent = 0); + virtual ~WelcomeModeTreeWidget(); + + void addItem(const QString &label, const QString &data,const QString &toolTip = QString::null); public slots: void slotAddNewsItem(const QString &title, const QString &description, const QString &link); + void clear(); signals: void activated(const QString &data); -protected: - virtual QSize minimumSizeHint() const; - virtual QSize sizeHint() const; - -private slots: - void slotItemClicked(QTreeWidgetItem *item); - private: + void addItemWidget(WelcomeModeItemWidget *w); + WelcomeModeTreeWidgetPrivate *m_d; }; diff --git a/src/plugins/projectexplorer/projectwelcomepagewidget.ui b/src/plugins/projectexplorer/projectwelcomepagewidget.ui index 75c1b37901c..2b6e582bd37 100644 --- a/src/plugins/projectexplorer/projectwelcomepagewidget.ui +++ b/src/plugins/projectexplorer/projectwelcomepagewidget.ui @@ -57,64 +57,6 @@ </property> <item row="3" column="0" colspan="3"> <widget class="Utils::WelcomeModeTreeWidget" name="projTreeWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="verticalScrollMode"> - <enum>QAbstractItemView::ScrollPerPixel</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - <column> - <property name="text"> - <string notr="true">2</string> - </property> - </column> </widget> </item> <item row="1" column="0" colspan="3"> @@ -172,64 +114,6 @@ </item> <item row="3" column="0" colspan="3"> <widget class="Utils::WelcomeModeTreeWidget" name="sessTreeWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="verticalScrollMode"> - <enum>QAbstractItemView::ScrollPerPixel</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - <column> - <property name="text"> - <string notr="true">2</string> - </property> - </column> </widget> </item> </layout> diff --git a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui index 86e3456e965..17a1d1ce67b 100644 --- a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui +++ b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui @@ -48,12 +48,6 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <property name="maximumSize"> - <size> - <width>400</width> - <height>16777215</height> - </size> - </property> <property name="styleSheet"> <string/> </property> @@ -76,64 +70,6 @@ </item> <item row="1" column="0"> <widget class="Utils::WelcomeModeTreeWidget" name="tutorialTreeWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="verticalScrollMode"> - <enum>QAbstractItemView::ScrollPerPixel</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - <column> - <property name="text"> - <string notr="true">2</string> - </property> - </column> </widget> </item> </layout> @@ -213,12 +149,12 @@ <string/> </property> <layout class="QGridLayout" name="gridLayout_11"> - <property name="verticalSpacing"> - <number>12</number> - </property> <property name="rightMargin"> <number>9</number> </property> + <property name="verticalSpacing"> + <number>12</number> + </property> <item row="0" column="0"> <widget class="Utils::WelcomeModeLabel" name="didYouKnowTitleLabel"> <property name="sizePolicy"> @@ -386,7 +322,6 @@ </layout> </item> </layout> - <zorder>createNewProjectButton</zorder> </widget> </item> </layout> diff --git a/src/plugins/welcome/communitywelcomepagewidget.ui b/src/plugins/welcome/communitywelcomepagewidget.ui index d48b8fcfe14..98cc438303a 100644 --- a/src/plugins/welcome/communitywelcomepagewidget.ui +++ b/src/plugins/welcome/communitywelcomepagewidget.ui @@ -67,70 +67,6 @@ </item> <item> <widget class="Utils::WelcomeModeTreeWidget" name="newsTreeWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>340</width> - <height>0</height> - </size> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="verticalScrollMode"> - <enum>QAbstractItemView::ScrollPerPixel</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - <column> - <property name="text"> - <string notr="true">2</string> - </property> - </column> </widget> </item> </layout> @@ -160,64 +96,6 @@ </item> <item> <widget class="Utils::WelcomeModeTreeWidget" name="supportSitesTreeWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="verticalScrollMode"> - <enum>QAbstractItemView::ScrollPerPixel</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - <column> - <property name="text"> - <string notr="true">2</string> - </property> - </column> </widget> </item> <item> @@ -235,65 +113,7 @@ </item> <item> <widget class="Utils::WelcomeModeTreeWidget" name="miscSitesTreeWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="verticalScrollMode"> - <enum>QAbstractItemView::ScrollPerPixel</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>24</number> - </attribute> - <attribute name="headerVisible"> - <bool>false</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>0</number> - </attribute> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - <column> - <property name="text"> - <string notr="true">2</string> - </property> - </column> - </widget> + </widget> </item> </layout> </widget> -- GitLab