QHeaderView - add parameter to control sizeHint precision
Currently Qt looks at 1000 rows when scaling a column. That can be slow in some situations and too inaccurate in others. With this patch we leave it up to the user to decide how precise e.g resizeToContents should be. Change-Id: I6ef60f9a3bb40fc331ce1a1544fdc77488d20ca3 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
parent
70410467f0
commit
adaa50e37d
4
dist/changes-5.2.0
vendored
4
dist/changes-5.2.0
vendored
@ -25,3 +25,7 @@ QtWidgets
|
||||
- QAbstractScrollArea now has a SizeAdjustPolicy. If it is set to AdjustToContents
|
||||
it will make use of the new protected viewportSizeHint() (binary compatible since it
|
||||
was reserved in Qt5). This function returns a suggested size based on contents.
|
||||
|
||||
- [QTBUG-4206] QTableView resizeToContents will now adjust to actual contents
|
||||
and not just visible area. QHeaderView::setAutoResizePrecision() has been
|
||||
introduced to control how precise the autoResize should be.
|
||||
|
@ -1253,7 +1253,7 @@ void QHeaderView::setSectionResizeMode(ResizeMode mode)
|
||||
property is set to true. This is the default for the horizontal headers provided
|
||||
by QTreeView.
|
||||
|
||||
\sa setStretchLastSection()
|
||||
\sa setStretchLastSection(), resizeContentsPrecision()
|
||||
*/
|
||||
|
||||
void QHeaderView::setSectionResizeMode(int logicalIndex, ResizeMode mode)
|
||||
@ -1316,6 +1316,53 @@ QHeaderView::ResizeMode QHeaderView::sectionResizeMode(int logicalIndex) const
|
||||
return d->headerSectionResizeMode(visual);
|
||||
}
|
||||
|
||||
/*!
|
||||
\since 5.2
|
||||
Sets how precise QHeaderView should calculate the size when ResizeToContents is used.
|
||||
A low value will provide a less accurate but fast auto resize while a higher
|
||||
value will provide a more accurate resize that however can be slow.
|
||||
|
||||
The number \a precision specifies how many sections that should be consider
|
||||
when calculating the preferred size.
|
||||
|
||||
The default value is 1000 meaning that a horizontal column with auto-resize will look
|
||||
at maximum 1000 rows on calculating when doing an auto resize.
|
||||
|
||||
Special value 0 means that it will look at only the visible area.
|
||||
Special value -1 will imply looking at all elements.
|
||||
|
||||
This value is used in QTableView::sizeHintForColumn(), QTableView::sizeHintForRow()
|
||||
and QTreeView::sizeHintForColumn(). Reimplementing these functions can make this
|
||||
function not having an effect.
|
||||
|
||||
If \a resizeSectionsNow is set to true (default) it will do adjustment of sections by calling
|
||||
resizeSections(). (regardless if the precision was changed).
|
||||
|
||||
\sa resizeContentsPrecision(), setSectionResizeMode(), resizeSections(), QTableView::sizeHintForColumn(), QTableView::sizeHintForRow(), QTreeView::sizeHintForColumn()
|
||||
*/
|
||||
|
||||
void QHeaderView::setResizeContentsPrecision(int precision, bool resizeSectionsNow)
|
||||
{
|
||||
Q_D(QHeaderView);
|
||||
d->resizeContentsPrecision = precision;
|
||||
if (resizeSectionsNow)
|
||||
resizeSections();
|
||||
}
|
||||
|
||||
/*!
|
||||
\since 5.2
|
||||
Returns how precise QHeaderView will calculate on ResizeToContents.
|
||||
|
||||
\sa setResizeContentsPrecision(), setSectionResizeMode()
|
||||
|
||||
*/
|
||||
|
||||
int QHeaderView::resizeContentsPrecision() const
|
||||
{
|
||||
Q_D(const QHeaderView);
|
||||
return d->resizeContentsPrecision;
|
||||
}
|
||||
|
||||
// ### Qt 6 - remove this obsolete function
|
||||
/*!
|
||||
\obsolete
|
||||
@ -3583,6 +3630,8 @@ void QHeaderViewPrivate::write(QDataStream &out) const
|
||||
out << int(globalResizeMode);
|
||||
|
||||
out << sectionItems;
|
||||
if (out.version() >= QDataStream::Qt_5_2)
|
||||
out << resizeContentsPrecision;
|
||||
}
|
||||
|
||||
bool QHeaderViewPrivate::read(QDataStream &in)
|
||||
@ -3634,6 +3683,10 @@ bool QHeaderViewPrivate::read(QDataStream &in)
|
||||
}
|
||||
sectionItems = newSectionItems;
|
||||
recalcSectionStartPos();
|
||||
|
||||
if (in.version() >= QDataStream::Qt_5_2)
|
||||
in >> resizeContentsPrecision;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -133,6 +133,10 @@ public:
|
||||
ResizeMode sectionResizeMode(int logicalIndex) const;
|
||||
void setSectionResizeMode(ResizeMode mode);
|
||||
void setSectionResizeMode(int logicalIndex, ResizeMode mode);
|
||||
|
||||
void setResizeContentsPrecision(int precision, bool resizeNow = true);
|
||||
int resizeContentsPrecision() const;
|
||||
|
||||
#if QT_DEPRECATED_SINCE(5, 0)
|
||||
inline QT_DEPRECATED void setResizeMode(ResizeMode mode)
|
||||
{ setSectionResizeMode(mode); }
|
||||
|
@ -99,7 +99,8 @@ public:
|
||||
sectionIndicatorOffset(0),
|
||||
sectionIndicator(0),
|
||||
globalResizeMode(QHeaderView::Interactive),
|
||||
sectionStartposRecalc(true)
|
||||
sectionStartposRecalc(true),
|
||||
resizeContentsPrecision(1000)
|
||||
{}
|
||||
|
||||
|
||||
@ -291,6 +292,7 @@ public:
|
||||
QHeaderView::ResizeMode globalResizeMode;
|
||||
QList<QPersistentModelIndex> persistentHiddenSections;
|
||||
mutable bool sectionStartposRecalc;
|
||||
int resizeContentsPrecision;
|
||||
// header sections
|
||||
|
||||
struct SectionItem {
|
||||
|
@ -2208,7 +2208,7 @@ void QTableView::updateGeometries()
|
||||
if a larger row height is required by either the vertical header or
|
||||
the item delegate, that width will be used instead.
|
||||
|
||||
\sa QWidget::sizeHint, verticalHeader()
|
||||
\sa QWidget::sizeHint, verticalHeader(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
int QTableView::sizeHintForRow(int row) const
|
||||
{
|
||||
@ -2218,7 +2218,8 @@ int QTableView::sizeHintForRow(int row) const
|
||||
return -1;
|
||||
|
||||
ensurePolished();
|
||||
const int maximumProcessCols = 1000; // To avoid this to take forever.
|
||||
const int maximumProcessCols = d->verticalHeader->resizeContentsPrecision();
|
||||
|
||||
|
||||
int left = qMax(0, d->horizontalHeader->visualIndexAt(0));
|
||||
int right = d->horizontalHeader->visualIndexAt(d->viewport->width());
|
||||
@ -2253,6 +2254,9 @@ int QTableView::sizeHintForRow(int row) const
|
||||
int idxLeft = left;
|
||||
int idxRight = column - 1;
|
||||
|
||||
if (maximumProcessCols == 0)
|
||||
columnsProcessed = 0; // skip the while loop
|
||||
|
||||
while (columnsProcessed != maximumProcessCols && (idxLeft > 0 || idxRight < actualRight)) {
|
||||
int logicalIdx = -1;
|
||||
|
||||
@ -2306,7 +2310,7 @@ int QTableView::sizeHintForRow(int row) const
|
||||
required by either the horizontal header or the item delegate, the larger
|
||||
width will be used instead.
|
||||
|
||||
\sa QWidget::sizeHint, horizontalHeader()
|
||||
\sa QWidget::sizeHint, horizontalHeader(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
int QTableView::sizeHintForColumn(int column) const
|
||||
{
|
||||
@ -2316,7 +2320,7 @@ int QTableView::sizeHintForColumn(int column) const
|
||||
return -1;
|
||||
|
||||
ensurePolished();
|
||||
const int maximumProcessRows = 1000; // To avoid this to take forever.
|
||||
const int maximumProcessRows = d->horizontalHeader->resizeContentsPrecision();
|
||||
|
||||
int top = qMax(0, d->verticalHeader->visualIndexAt(0));
|
||||
int bottom = d->verticalHeader->visualIndexAt(d->viewport->height());
|
||||
@ -2345,6 +2349,9 @@ int QTableView::sizeHintForColumn(int column) const
|
||||
int idxTop = top;
|
||||
int idxBottom = row - 1;
|
||||
|
||||
if (maximumProcessRows == 0)
|
||||
rowsProcessed = 0; // skip the while loop
|
||||
|
||||
while (rowsProcessed != maximumProcessRows && (idxTop > 0 || idxBottom < actualBottom)) {
|
||||
int logicalIdx = -1;
|
||||
|
||||
@ -3038,6 +3045,8 @@ void QTableView::showColumn(int column)
|
||||
/*!
|
||||
Resizes the given \a row based on the size hints of the delegate
|
||||
used to render each item in the row.
|
||||
|
||||
\sa resizeRowsToContents(), sizeHintForRow(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
void QTableView::resizeRowToContents(int row)
|
||||
{
|
||||
@ -3050,6 +3059,8 @@ void QTableView::resizeRowToContents(int row)
|
||||
/*!
|
||||
Resizes all rows based on the size hints of the delegate
|
||||
used to render each item in the rows.
|
||||
|
||||
\sa resizeRowToContents(), sizeHintForRow(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
void QTableView::resizeRowsToContents()
|
||||
{
|
||||
@ -3063,6 +3074,8 @@ void QTableView::resizeRowsToContents()
|
||||
|
||||
\note Only visible columns will be resized. Reimplement sizeHintForColumn()
|
||||
to resize hidden columns as well.
|
||||
|
||||
\sa resizeColumnsToContents(), sizeHintForColumn(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
void QTableView::resizeColumnToContents(int column)
|
||||
{
|
||||
@ -3075,6 +3088,8 @@ void QTableView::resizeColumnToContents(int column)
|
||||
/*!
|
||||
Resizes all columns based on the size hints of the delegate
|
||||
used to render each item in the columns.
|
||||
|
||||
\sa resizeColumnToContents(), sizeHintForColumn(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
void QTableView::resizeColumnsToContents()
|
||||
{
|
||||
|
@ -2565,7 +2565,7 @@ void QTreeView::columnCountChanged(int oldCount, int newCount)
|
||||
/*!
|
||||
Resizes the \a column given to the size of its contents.
|
||||
|
||||
\sa columnWidth(), setColumnWidth()
|
||||
\sa columnWidth(), setColumnWidth(), sizeHintForColumn(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
void QTreeView::resizeColumnToContents(int column)
|
||||
{
|
||||
@ -2801,7 +2801,7 @@ void QTreeView::updateGeometries()
|
||||
if a larger column width is required by either the view's header or
|
||||
the item delegate, that width will be used instead.
|
||||
|
||||
\sa QWidget::sizeHint, header()
|
||||
\sa QWidget::sizeHint, header(), QHeaderView::resizeContentsPrecision()
|
||||
*/
|
||||
int QTreeView::sizeHintForColumn(int column) const
|
||||
{
|
||||
@ -2814,7 +2814,7 @@ int QTreeView::sizeHintForColumn(int column) const
|
||||
QStyleOptionViewItem option = d->viewOptions();
|
||||
const QVector<QTreeViewItem> viewItems = d->viewItems;
|
||||
|
||||
const int maximumProcessRows = 1000; // To avoid this to take forever.
|
||||
const int maximumProcessRows = d->header->resizeContentsPrecision(); // To avoid this to take forever.
|
||||
|
||||
int offset = 0;
|
||||
int start = d->firstVisibleItem(&offset);
|
||||
@ -2835,6 +2835,10 @@ int QTreeView::sizeHintForColumn(int column) const
|
||||
|
||||
--end;
|
||||
int actualBottom = viewItems.size() - 1;
|
||||
|
||||
if (maximumProcessRows == 0)
|
||||
rowsProcessed = 0; // skip the while loop
|
||||
|
||||
while (rowsProcessed != maximumProcessRows && (start > 0 || end < actualBottom)) {
|
||||
int idx = -1;
|
||||
|
||||
|
@ -0,0 +1,115 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Thorbjørn Lund Martsum - tmartsum[at]gmail.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** 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 Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtWidgets/QtWidgets>
|
||||
|
||||
const int rowCount = 2000;
|
||||
|
||||
class TableDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TableDialog() : model(rowCount, 3) { create(); }
|
||||
void create()
|
||||
{
|
||||
resize(1000, 233);
|
||||
gridLayout = new QGridLayout(this);
|
||||
tableView = new QTableView(this);
|
||||
|
||||
gridLayout->addWidget(tableView, 0, 0, 2, 1);
|
||||
spinPrecision = new QSpinBox(this);
|
||||
gridLayout->addWidget(spinPrecision, 0, 1, 1, 1);
|
||||
verticalSpacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||
gridLayout->addItem(verticalSpacer, 1, 1, 1, 1);
|
||||
|
||||
QString ii = QString::fromLatin1("ii");
|
||||
QStringList is;
|
||||
spinPrecision->setMinimum(-1);
|
||||
spinPrecision->setMaximum(rowCount + 2);
|
||||
for (int u = 0; u < rowCount; ++u) {
|
||||
if (u % 25 == 0)
|
||||
ii += QString::fromLatin1("i");
|
||||
else
|
||||
ii[ii.length() - 1] = QChar::fromLatin1('a' + (u % 25));
|
||||
ii[ii.length() - 2] = QChar::fromLatin1('i');
|
||||
is.append(ii);
|
||||
}
|
||||
|
||||
for (int u = 0; u < rowCount; ++u) {
|
||||
QString col1;
|
||||
col1 = QString::fromLatin1("Row: %1").arg(u);
|
||||
model.setData(model.index(u, 0), col1);
|
||||
model.setData(model.index(u, 1), is[u]);
|
||||
model.setData(model.index(u, 2), is[rowCount - u -1]);
|
||||
}
|
||||
tableView->setModel(&model);
|
||||
|
||||
tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
||||
tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
||||
tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
|
||||
spinPrecision->setValue(tableView->horizontalHeader()->resizeContentsPrecision());
|
||||
connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)));
|
||||
} // setupUi
|
||||
protected slots:
|
||||
void slotValueChanged(int newval);
|
||||
protected:
|
||||
QGridLayout *gridLayout;
|
||||
QTableView *tableView;
|
||||
QSpinBox *spinPrecision;
|
||||
QSpacerItem *verticalSpacer;
|
||||
QStandardItemModel model;
|
||||
};
|
||||
|
||||
void TableDialog::slotValueChanged(int newval)
|
||||
{
|
||||
tableView->horizontalHeader()->setResizeContentsPrecision(newval, true);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
TableDialog d1;
|
||||
d1.show();
|
||||
app.exec();
|
||||
}
|
||||
|
||||
#include "testtable1.moc"
|
@ -0,0 +1,2 @@
|
||||
SOURCES = testtable1.cpp
|
||||
QT += widgets
|
@ -0,0 +1,125 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Thorbjørn Lund Martsum - tmartsum[at]gmail.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** 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 Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtWidgets/QtWidgets>
|
||||
|
||||
const int columnCount = 1500;
|
||||
|
||||
class TableDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TableDialog() : model(2, columnCount) { create(); }
|
||||
void create()
|
||||
{
|
||||
resize(1200, 400);
|
||||
gridLayout = new QGridLayout(this);
|
||||
tableView = new QTableView(this);
|
||||
|
||||
gridLayout->addWidget(tableView, 0, 0, 2, 1);
|
||||
spinPrecision = new QSpinBox(this);
|
||||
gridLayout->addWidget(spinPrecision, 0, 1, 1, 1);
|
||||
verticalSpacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||
gridLayout->addItem(verticalSpacer, 1, 1, 1, 1);
|
||||
|
||||
QString ii = QString::fromLatin1("ii");
|
||||
QStringList is;
|
||||
spinPrecision->setMinimum(-1);
|
||||
spinPrecision->setMaximum(columnCount + 2);
|
||||
|
||||
QFont f = QApplication::font();
|
||||
for (int u = 0; u < columnCount; ++u) {
|
||||
int size = 10 + (u % 63);
|
||||
f.setPixelSize(size);
|
||||
QString col;
|
||||
if (u % 50 < 25)
|
||||
col = QChar::fromLatin1('a' + (u % 25));
|
||||
else
|
||||
col = QChar::fromLatin1('A' + (u % 25));
|
||||
|
||||
int v = columnCount - u - 1;
|
||||
model.setData(model.index(0, u), col);
|
||||
model.setData(model.index(1, v), col);
|
||||
|
||||
model.setData(model.index(0, u), f, Qt::FontRole);
|
||||
model.setData(model.index(1, v), f, Qt::FontRole);
|
||||
}
|
||||
tableView->setModel(&model);
|
||||
|
||||
for (int u = 0; u < columnCount; ++ u)
|
||||
tableView->horizontalHeader()->resizeSection(u, 60);
|
||||
|
||||
// Make last index in first row a bit special
|
||||
f.setPixelSize(96);
|
||||
model.setData(model.index(0, columnCount - 1), f, Qt::FontRole);
|
||||
model.setData(model.index(0, columnCount - 1), QString::fromLatin1("qI"));
|
||||
tableView->horizontalHeader()->resizeSection(columnCount - 1, 140);
|
||||
|
||||
tableView->verticalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
||||
tableView->verticalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
||||
spinPrecision->setValue(tableView->verticalHeader()->resizeContentsPrecision());
|
||||
connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)));
|
||||
} // setupUi
|
||||
protected slots:
|
||||
void slotValueChanged(int newval);
|
||||
protected:
|
||||
QGridLayout *gridLayout;
|
||||
QTableView *tableView;
|
||||
QSpinBox *spinPrecision;
|
||||
QSpacerItem *verticalSpacer;
|
||||
QStandardItemModel model;
|
||||
};
|
||||
|
||||
void TableDialog::slotValueChanged(int newval)
|
||||
{
|
||||
tableView->verticalHeader()->setResizeContentsPrecision(newval, true);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
TableDialog d1;
|
||||
d1.show();
|
||||
app.exec();
|
||||
}
|
||||
|
||||
#include "testtable2.moc"
|
@ -0,0 +1,2 @@
|
||||
SOURCES = testtable2.cpp
|
||||
QT += widgets
|
@ -0,0 +1,132 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Thorbjørn Lund Martsum - tmartsum[at]gmail.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** 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 Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtWidgets/QtWidgets>
|
||||
|
||||
class TreeDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TreeDialog() { create(); }
|
||||
protected:
|
||||
void create()
|
||||
{
|
||||
resize(1000, 233);
|
||||
gridLayout = new QGridLayout(this);
|
||||
treeWidget = new QTreeWidget(this);
|
||||
|
||||
gridLayout->addWidget(treeWidget, 0, 0, 2, 1);
|
||||
spinPrecision = new QSpinBox(this);
|
||||
gridLayout->addWidget(spinPrecision, 0, 1, 1, 1);
|
||||
verticalSpacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||
gridLayout->addItem(verticalSpacer, 1, 1, 1, 1);
|
||||
|
||||
QStringList itemInfo("Col1");
|
||||
itemInfo.append("Col2");
|
||||
itemInfo.append("Col3");
|
||||
itemInfo.append("Dummy");
|
||||
// Developer no. could also have been social security number og some other id.
|
||||
treeWidget->setHeaderLabels(itemInfo);
|
||||
|
||||
QStringList sl1("This is Root Item");
|
||||
sl1.append("i");
|
||||
QTreeWidgetItem *rootitem = new QTreeWidgetItem(treeWidget, sl1);
|
||||
|
||||
QStringList sl2("This is Child1 Item");
|
||||
sl2.append("WW");
|
||||
QTreeWidgetItem *child1 = new QTreeWidgetItem(rootitem, sl2);
|
||||
|
||||
QString ii = QString::fromLatin1("ii");
|
||||
QStringList is;
|
||||
const int rowCount = 3000;
|
||||
spinPrecision->setMinimum(-1);
|
||||
spinPrecision->setMaximum(rowCount + 5);
|
||||
for (int u = 0; u < rowCount; ++u) {
|
||||
if (u % 25 == 0)
|
||||
ii += QString::fromLatin1("i");
|
||||
else
|
||||
ii[ii.length() - 1] = QChar::fromLatin1('a' + (u % 25));
|
||||
ii[ii.length() - 2] = QChar::fromLatin1('i');
|
||||
is.append(ii);
|
||||
}
|
||||
|
||||
for (int u = 0; u < rowCount - 2; ++u) { // -2 since we have rootitem and child1
|
||||
QString col1;
|
||||
col1 = QString::fromLatin1("This is child item %1").arg(u + 2);
|
||||
|
||||
QStringList sl(col1);
|
||||
sl.append(is[u]);
|
||||
sl.append(is[rowCount - u - 1]);
|
||||
|
||||
if (u > 500)
|
||||
new QTreeWidgetItem(rootitem, sl);
|
||||
else
|
||||
new QTreeWidgetItem(child1, sl);
|
||||
}
|
||||
treeWidget->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
||||
treeWidget->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
||||
treeWidget->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
|
||||
spinPrecision->setValue(treeWidget->header()->resizeContentsPrecision());
|
||||
connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)));
|
||||
} // setupUi
|
||||
protected slots:
|
||||
void slotValueChanged(int newval);
|
||||
protected:
|
||||
QGridLayout *gridLayout;
|
||||
QTreeWidget *treeWidget;
|
||||
QSpinBox *spinPrecision;
|
||||
QSpacerItem *verticalSpacer;
|
||||
};
|
||||
|
||||
void TreeDialog::slotValueChanged(int newval)
|
||||
{
|
||||
treeWidget->header()->setResizeContentsPrecision(newval, true);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
TreeDialog d1;
|
||||
d1.show();
|
||||
app.exec();
|
||||
}
|
||||
|
||||
#include "testtree.moc"
|
@ -0,0 +1,2 @@
|
||||
SOURCES = testtree.cpp
|
||||
QT += widgets
|
Loading…
Reference in New Issue
Block a user