qt5base-lts/tests/manual/qscreen/propertywatcher.cpp
Marc Mutz f2f8820073 tests: port assorted trivial uses of Q_FOREACH to ranged for loops
All of these fall into the trivial category: loops over (readily made)
const local containers. As such, they cannot possibly depend on the
safety copy that Q_FOREACH performs, so are safe to port as-is to
ranged for loops.

There may be more where these came from, but these were the ones that
stood out as immediately obvious when scanning the 100s of uses in
qtbase, so I preferred to directly fix them over white-listing their
files with QT_NO_FOREACH (which still may be necessary for some files,
as this patch may not port all uses in that file).

Pick-to: 6.6 6.5
Task-nubmber: QTBUG-115839
Change-Id: I7b7893bec8254f902660dac24167113aca855029
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
2023-08-14 23:11:54 +03:00

98 lines
3.0 KiB
C++

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "propertywatcher.h"
#include <QMetaProperty>
#include <QFormLayout>
#include <QPushButton>
#include <QLabel>
#include "propertyfield.h"
PropertyWatcher::PropertyWatcher(QObject *subject, QString annotation, QWidget *parent)
: QWidget(parent), m_subject(nullptr), m_formLayout(new QFormLayout(this))
{
setMinimumSize(450, 300);
m_formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
setSubject(subject, annotation);
}
class UpdatesEnabledBlocker
{
Q_DISABLE_COPY(UpdatesEnabledBlocker);
public:
explicit UpdatesEnabledBlocker(QWidget *w) : m_widget(w)
{
m_widget->setUpdatesEnabled(false);
}
~UpdatesEnabledBlocker()
{
m_widget->setUpdatesEnabled(true);
m_widget->update();
}
private:
QWidget *m_widget;
};
void PropertyWatcher::setSubject(QObject *s, const QString &annotation)
{
if (s == m_subject)
return;
UpdatesEnabledBlocker blocker(this);
if (m_subject) {
disconnect(m_subject, &QObject::destroyed, this, &PropertyWatcher::subjectDestroyed);
for (int i = m_formLayout->count() - 1; i >= 0; --i) {
QLayoutItem *item = m_formLayout->takeAt(i);
delete item->widget();
delete item;
}
window()->setWindowTitle(QString());
window()->setWindowIconText(QString());
}
m_subject = s;
if (!m_subject)
return;
const QMetaObject* meta = m_subject->metaObject();
QString title = QLatin1String("Properties ") + QLatin1String(meta->className());
if (!m_subject->objectName().isEmpty())
title += QLatin1Char(' ') + m_subject->objectName();
if (!annotation.isEmpty())
title += QLatin1Char(' ') + annotation;
window()->setWindowTitle(title);
for (int i = 0, count = meta->propertyCount(); i < count; ++i) {
const QMetaProperty prop = meta->property(i);
if (prop.isReadable()) {
QLabel *label = new QLabel(prop.name(), this);
PropertyField *field = new PropertyField(m_subject, prop, this);
m_formLayout->addRow(label, field);
if (!qstrcmp(prop.name(), "name"))
window()->setWindowIconText(prop.read(m_subject).toString());
label->setVisible(true);
field->setVisible(true);
}
}
connect(m_subject, &QObject::destroyed, this, &PropertyWatcher::subjectDestroyed);
QPushButton *updateButton = new QPushButton(QLatin1String("Update"), this);
connect(updateButton, &QPushButton::clicked, this, &PropertyWatcher::updateAllFields);
m_formLayout->addRow(QString(), updateButton);
}
void PropertyWatcher::updateAllFields()
{
const QList<PropertyField *> fields = findChildren<PropertyField*>();
for (PropertyField *field : fields)
field->propertyChanged();
emit updatedAllFields(this);
}
void PropertyWatcher::subjectDestroyed()
{
qDebug("screen destroyed");
}