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). 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> (cherry picked from commit f2f8820073488c89fb71e3eb2d2e87bb582c3995) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
98 lines
3.0 KiB
C++
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");
|
|
}
|