7#include <QtWidgets/QGridLayout>
8#include <QtWidgets/QGroupBox>
9#include <QtWidgets/QLabel>
16 Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser)
25 {
return q_ptr->createEditor(property, parent); }
43 static void insertRow(QGridLayout *layout,
int row);
44 static void removeRow(QGridLayout *layout,
int row);
48 QHash<QtBrowserItem *, WidgetItem *> m_indexToItem;
49 QHash<WidgetItem *, QtBrowserItem *> m_itemToIndex;
50 QGridLayout *m_mainLayout;
51 QList<WidgetItem *> m_children;
52 QList<WidgetItem *> m_recreateQueue;
57 m_mainLayout =
new QGridLayout();
58 parent->setLayout(m_mainLayout);
59 auto *item =
new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
60 m_mainLayout->addItem(item, 0, 0);
65 for (WidgetItem *item : std::as_const(m_recreateQueue)) {
66 WidgetItem *par = item->parent;
68 QGridLayout *l =
nullptr;
69 qsizetype oldRow = -1;
73 oldRow = m_children.indexOf(item);
77 oldRow = par->children.indexOf(item);
83 item->widget->setParent(w);
84 }
else if (item->widgetLabel) {
85 item->widgetLabel->setParent(w);
87 item->widgetLabel =
new QLabel(w);
91 l->addWidget(item->widget, oldRow, 1, 1, 1);
92 else if (item->widgetLabel)
93 l->addWidget(item->widgetLabel, oldRow, 1, 1, 1);
96 item->label =
new QLabel(w);
97 item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
98 l->addWidget(item->label, oldRow, 0, 1, span);
102 m_recreateQueue.clear();
107 QMetaObject::invokeMethod(q_ptr, [
this] { slotUpdate(); }, Qt::QueuedConnection);
112 WidgetItem *afterItem = m_indexToItem.value(afterIndex);
113 WidgetItem *parentItem = m_indexToItem.value(index->parent());
118 QGridLayout *layout =
nullptr;
119 QWidget *parentWidget =
nullptr;
124 parentItem->children.insert(0, newItem);
126 m_children.insert(0, newItem);
129 row = parentItem->children.indexOf(afterItem) + 1;
130 parentItem->children.insert(row, newItem);
132 row = m_children.indexOf(afterItem) + 1;
133 m_children.insert(row, newItem);
136 if (parentItem && hasHeader(parentItem))
140 layout = m_mainLayout;
141 parentWidget = q_ptr;
143 if (!parentItem->groupBox) {
144 m_recreateQueue.removeAll(parentItem);
146 QWidget *w =
nullptr;
147 QGridLayout *l =
nullptr;
152 oldRow = m_children.indexOf(parentItem);
156 oldRow = par->children.indexOf(parentItem);
160 parentItem->groupBox =
new QGroupBox(w);
161 parentItem->layout =
new QGridLayout();
162 parentItem->groupBox->setLayout(parentItem->layout);
163 if (parentItem->label) {
164 l->removeWidget(parentItem->label);
165 delete parentItem->label;
166 parentItem->label =
nullptr;
168 if (parentItem->widget) {
169 l->removeWidget(parentItem->widget);
170 parentItem->widget->setParent(parentItem->groupBox);
171 parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2);
172 parentItem->line =
new QFrame(parentItem->groupBox);
173 }
else if (parentItem->widgetLabel) {
174 l->removeWidget(parentItem->widgetLabel);
175 delete parentItem->widgetLabel;
176 parentItem->widgetLabel =
nullptr;
178 if (parentItem->line) {
179 parentItem->line->setFrameShape(QFrame::HLine);
180 parentItem->line->setFrameShadow(QFrame::Sunken);
181 parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2);
183 l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2);
184 updateItem(parentItem);
186 layout = parentItem->layout;
187 parentWidget = parentItem->groupBox;
190 newItem->label =
new QLabel(parentWidget);
191 newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
192 newItem->widget = createEditor(index->property(), parentWidget);
193 if (!newItem->widget)
194 newItem->widgetLabel =
new QLabel(parentWidget);
196 insertRow(layout, row);
199 layout->addWidget(newItem->widget, row, 1);
200 else if (newItem->widgetLabel)
201 layout->addWidget(newItem->widgetLabel, row, 1);
204 layout->addWidget(newItem->label, row, 0, 1, span);
206 m_itemToIndex[newItem] = index;
207 m_indexToItem[index] = newItem;
214 WidgetItem *item = m_indexToItem.value(index);
216 m_indexToItem.remove(index);
217 m_itemToIndex.remove(item);
224 row = parentItem->children.indexOf(item);
225 parentItem->children.removeAt(row);
226 if (hasHeader(parentItem))
229 row = m_children.indexOf(item);
230 m_children.removeAt(row);
235 delete item->widgetLabel;
236 delete item->groupBox;
239 removeRow(m_mainLayout, row);
240 }
else if (!parentItem->children.empty()) {
241 removeRow(parentItem->layout, row);
244 QGridLayout *l = (par ? par->layout : m_mainLayout);
245 if (parentItem->widget) {
246 parentItem->widget->hide();
247 parentItem->widget->setParent(
nullptr);
248 }
else if (parentItem->widgetLabel) {
249 parentItem->widgetLabel->hide();
250 parentItem->widgetLabel->setParent(
nullptr);
254 l->removeWidget(parentItem->groupBox);
255 delete parentItem->groupBox;
256 parentItem->groupBox =
nullptr;
257 parentItem->line =
nullptr;
258 parentItem->layout =
nullptr;
259 if (!m_recreateQueue.contains(parentItem))
260 m_recreateQueue.append(parentItem);
263 m_recreateQueue.removeAll(item);
270 QHash<QLayoutItem *, QRect> itemToPos;
272 while (idx < layout->count()) {
274 layout->getItemPosition(idx, &r, &c, &rs, &cs);
276 itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
282 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
283 const QRect r = it.value();
284 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
290 QHash<QLayoutItem *, QRect> itemToPos;
292 while (idx < layout->count()) {
294 layout->getItemPosition(idx, &r, &c, &rs, &cs);
296 itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
302 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
303 const QRect r = it.value();
304 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
315 WidgetItem *item = m_indexToItem.value(index);
322 QtProperty *property = m_itemToIndex[item]->property();
323 if (item->groupBox) {
324 QFont font = item->groupBox->font();
326 item->groupBox->setFont(font);
327 item->groupBox->setTitle(property->propertyName());
328 item->groupBox->setToolTip(property->descriptionToolTip());
329 item->groupBox->setStatusTip(property->statusTip());
330 item->groupBox->setWhatsThis(property->whatsThis());
334 QFont font = item->label->font();
336 item->label->setFont(font);
337 item->label->setText(property->propertyName());
338 item->label->setToolTip(property->descriptionToolTip());
339 item->label->setStatusTip(property->statusTip());
340 item->label->setWhatsThis(property->whatsThis());
343 if (item->widgetLabel) {
344 QFont font = item->widgetLabel->font();
345 font.setUnderline(
false);
346 item->widgetLabel->setFont(font);
347 item->widgetLabel->setText(property->valueText());
351 QFont font = item->widget->font();
352 font.setUnderline(
false);
353 item->widget->setFont(font);
355 const QString valueToolTip = property->valueToolTip();
356 item->widget->setToolTip(valueToolTip.isEmpty() ? property->valueText() : valueToolTip);
364
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
393
394
404
405
406
407
408
409
410
411
412
415 for (
auto it = d_ptr->m_itemToIndex.cbegin(), icend = d_ptr->m_itemToIndex.cend(); it != icend; ++it)
420
421
424 d_ptr->propertyInserted(item, afterItem);
428
429
432 d_ptr->propertyRemoved(item);
436
437
440 d_ptr->propertyChanged(item);
445#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.