6#include <QtWidgets/qgridlayout.h>
7#include <QtWidgets/qgroupbox.h>
8#include <QtWidgets/qlabel.h>
10#include <QtCore/qhash.h>
17 Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser)
26 {
return q_ptr->createEditor(property, parent); }
44 static void insertRow(QGridLayout *layout,
int row);
45 static void removeRow(QGridLayout *layout,
int row);
49 QHash<QtBrowserItem *, WidgetItem *> m_indexToItem;
50 QHash<WidgetItem *, QtBrowserItem *> m_itemToIndex;
51 QGridLayout *m_mainLayout;
52 QList<WidgetItem *> m_children;
53 QList<WidgetItem *> m_recreateQueue;
58 m_mainLayout =
new QGridLayout();
59 parent->setLayout(m_mainLayout);
60 auto *item =
new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
61 m_mainLayout->addItem(item, 0, 0);
66 for (WidgetItem *item : std::as_const(m_recreateQueue)) {
67 WidgetItem *par = item->parent;
69 QGridLayout *l =
nullptr;
70 qsizetype oldRow = -1;
74 oldRow = m_children.indexOf(item);
78 oldRow = par->children.indexOf(item);
84 item->widget->setParent(w);
85 }
else if (item->widgetLabel) {
86 item->widgetLabel->setParent(w);
88 item->widgetLabel =
new QLabel(w);
92 l->addWidget(item->widget, oldRow, 1, 1, 1);
93 else if (item->widgetLabel)
94 l->addWidget(item->widgetLabel, oldRow, 1, 1, 1);
97 item->label =
new QLabel(w);
98 item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
99 l->addWidget(item->label, oldRow, 0, 1, span);
103 m_recreateQueue.clear();
108 QMetaObject::invokeMethod(q_ptr, [
this] { slotUpdate(); }, Qt::QueuedConnection);
113 WidgetItem *afterItem = m_indexToItem.value(afterIndex);
114 WidgetItem *parentItem = m_indexToItem.value(index->parent());
119 QGridLayout *layout =
nullptr;
120 QWidget *parentWidget =
nullptr;
125 parentItem->children.insert(0, newItem);
127 m_children.insert(0, newItem);
130 row = parentItem->children.indexOf(afterItem) + 1;
131 parentItem->children.insert(row, newItem);
133 row = m_children.indexOf(afterItem) + 1;
134 m_children.insert(row, newItem);
137 if (parentItem && hasHeader(parentItem))
141 layout = m_mainLayout;
142 parentWidget = q_ptr;
144 if (!parentItem->groupBox) {
145 m_recreateQueue.removeAll(parentItem);
147 QWidget *w =
nullptr;
148 QGridLayout *l =
nullptr;
153 oldRow = m_children.indexOf(parentItem);
157 oldRow = par->children.indexOf(parentItem);
161 parentItem->groupBox =
new QGroupBox(w);
162 parentItem->layout =
new QGridLayout();
163 parentItem->groupBox->setLayout(parentItem->layout);
164 if (parentItem->label) {
165 l->removeWidget(parentItem->label);
166 delete parentItem->label;
167 parentItem->label =
nullptr;
169 if (parentItem->widget) {
170 l->removeWidget(parentItem->widget);
171 parentItem->widget->setParent(parentItem->groupBox);
172 parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2);
173 parentItem->line =
new QFrame(parentItem->groupBox);
174 }
else if (parentItem->widgetLabel) {
175 l->removeWidget(parentItem->widgetLabel);
176 delete parentItem->widgetLabel;
177 parentItem->widgetLabel =
nullptr;
179 if (parentItem->line) {
180 parentItem->line->setFrameShape(QFrame::HLine);
181 parentItem->line->setFrameShadow(QFrame::Sunken);
182 parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2);
184 l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2);
185 updateItem(parentItem);
187 layout = parentItem->layout;
188 parentWidget = parentItem->groupBox;
191 newItem->label =
new QLabel(parentWidget);
192 newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
193 newItem->widget = createEditor(index->property(), parentWidget);
194 if (!newItem->widget)
195 newItem->widgetLabel =
new QLabel(parentWidget);
197 insertRow(layout, row);
200 layout->addWidget(newItem->widget, row, 1);
201 else if (newItem->widgetLabel)
202 layout->addWidget(newItem->widgetLabel, row, 1);
205 layout->addWidget(newItem->label, row, 0, 1, span);
207 m_itemToIndex[newItem] = index;
208 m_indexToItem[index] = newItem;
215 WidgetItem *item = m_indexToItem.value(index);
217 m_indexToItem.remove(index);
218 m_itemToIndex.remove(item);
225 row = parentItem->children.indexOf(item);
226 parentItem->children.removeAt(row);
227 if (hasHeader(parentItem))
230 row = m_children.indexOf(item);
231 m_children.removeAt(row);
236 delete item->widgetLabel;
237 delete item->groupBox;
240 removeRow(m_mainLayout, row);
241 }
else if (!parentItem->children.empty()) {
242 removeRow(parentItem->layout, row);
245 QGridLayout *l = (par ? par->layout : m_mainLayout);
246 if (parentItem->widget) {
247 parentItem->widget->hide();
248 parentItem->widget->setParent(
nullptr);
249 }
else if (parentItem->widgetLabel) {
250 parentItem->widgetLabel->hide();
251 parentItem->widgetLabel->setParent(
nullptr);
255 l->removeWidget(parentItem->groupBox);
256 delete parentItem->groupBox;
257 parentItem->groupBox =
nullptr;
258 parentItem->line =
nullptr;
259 parentItem->layout =
nullptr;
260 if (!m_recreateQueue.contains(parentItem))
261 m_recreateQueue.append(parentItem);
264 m_recreateQueue.removeAll(item);
271 QHash<QLayoutItem *, QRect> itemToPos;
273 while (idx < layout->count()) {
275 layout->getItemPosition(idx, &r, &c, &rs, &cs);
277 itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
283 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
284 const QRect r = it.value();
285 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
291 QHash<QLayoutItem *, QRect> itemToPos;
293 while (idx < layout->count()) {
295 layout->getItemPosition(idx, &r, &c, &rs, &cs);
297 itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
303 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
304 const QRect r = it.value();
305 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
316 WidgetItem *item = m_indexToItem.value(index);
323 QtProperty *property = m_itemToIndex[item]->property();
324 if (item->groupBox) {
325 QFont font = item->groupBox->font();
327 item->groupBox->setFont(font);
328 item->groupBox->setTitle(property->propertyName());
329 item->groupBox->setToolTip(property->descriptionToolTip());
330 item->groupBox->setStatusTip(property->statusTip());
331 item->groupBox->setWhatsThis(property->whatsThis());
335 QFont font = item->label->font();
337 item->label->setFont(font);
338 item->label->setText(property->propertyName());
339 item->label->setToolTip(property->descriptionToolTip());
340 item->label->setStatusTip(property->statusTip());
341 item->label->setWhatsThis(property->whatsThis());
344 if (item->widgetLabel) {
345 QFont font = item->widgetLabel->font();
346 font.setUnderline(
false);
347 item->widgetLabel->setFont(font);
348 item->widgetLabel->setText(property->valueText());
352 QFont font = item->widget->font();
353 font.setUnderline(
false);
354 item->widget->setFont(font);
356 const QString valueToolTip = property->valueToolTip();
357 item->widget->setToolTip(valueToolTip.isEmpty() ? property->valueText() : valueToolTip);
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
394
395
405
406
407
408
409
410
411
412
413
416 for (
auto it = d_ptr->m_itemToIndex.cbegin(), icend = d_ptr->m_itemToIndex.cend(); it != icend; ++it)
421
422
425 d_ptr->propertyInserted(item, afterItem);
429
430
433 d_ptr->propertyRemoved(item);
437
438
441 d_ptr->propertyChanged(item);
446#include "moc_qtgroupboxpropertybrowser_p.cpp"
QtAbstractPropertyBrowser provides a base class for implementing property browsers.
The QtBrowserItem class represents a property in a property browser instance.
void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
QWidget * createEditor(QtProperty *property, QWidget *parent) const
void propertyRemoved(QtBrowserItem *index)
void propertyChanged(QtBrowserItem *index)
The QtGroupBoxPropertyBrowser class provides a QGroupBox based property browser.
~QtGroupBoxPropertyBrowser() override
Destroys this property browser.
void itemChanged(QtBrowserItem *item) override
\reimp
void itemRemoved(QtBrowserItem *item) override
\reimp
void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) override
\reimp
The QtProperty class encapsulates an instance of a property.
bool isEnabled() const
Returns whether the property is enabled.
bool isModified() const
Returns whether the property is modified.
Combined button and popup list for selecting options.