7#include <QtWidgets/qgridlayout.h>
8#include <QtWidgets/qgroupbox.h>
9#include <QtWidgets/qlabel.h>
11#include <QtCore/qhash.h>
18 Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser)
27 {
return q_ptr->createEditor(property, parent); }
45 static void insertRow(QGridLayout *layout,
int row);
46 static void removeRow(QGridLayout *layout,
int row);
50 QHash<QtBrowserItem *, WidgetItem *> m_indexToItem;
51 QHash<WidgetItem *, QtBrowserItem *> m_itemToIndex;
52 QGridLayout *m_mainLayout;
53 QList<WidgetItem *> m_children;
54 QList<WidgetItem *> m_recreateQueue;
59 m_mainLayout =
new QGridLayout();
60 parent->setLayout(m_mainLayout);
61 auto *item =
new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
62 m_mainLayout->addItem(item, 0, 0);
67 for (WidgetItem *item : std::as_const(m_recreateQueue)) {
68 WidgetItem *par = item->parent;
70 QGridLayout *l =
nullptr;
71 qsizetype oldRow = -1;
75 oldRow = m_children.indexOf(item);
79 oldRow = par->children.indexOf(item);
85 item->widget->setParent(w);
86 }
else if (item->widgetLabel) {
87 item->widgetLabel->setParent(w);
89 item->widgetLabel =
new QLabel(w);
93 l->addWidget(item->widget, oldRow, 1, 1, 1);
94 else if (item->widgetLabel)
95 l->addWidget(item->widgetLabel, oldRow, 1, 1, 1);
98 item->label =
new QLabel(w);
99 item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
100 l->addWidget(item->label, oldRow, 0, 1, span);
104 m_recreateQueue.clear();
109 QMetaObject::invokeMethod(q_ptr, [
this] { slotUpdate(); }, Qt::QueuedConnection);
114 WidgetItem *afterItem = m_indexToItem.value(afterIndex);
115 WidgetItem *parentItem = m_indexToItem.value(index->parent());
120 QGridLayout *layout =
nullptr;
121 QWidget *parentWidget =
nullptr;
126 parentItem->children.insert(0, newItem);
128 m_children.insert(0, newItem);
131 row = parentItem->children.indexOf(afterItem) + 1;
132 parentItem->children.insert(row, newItem);
134 row = m_children.indexOf(afterItem) + 1;
135 m_children.insert(row, newItem);
138 if (parentItem && hasHeader(parentItem))
142 layout = m_mainLayout;
143 parentWidget = q_ptr;
145 if (!parentItem->groupBox) {
146 m_recreateQueue.removeAll(parentItem);
148 QWidget *w =
nullptr;
149 QGridLayout *l =
nullptr;
154 oldRow = m_children.indexOf(parentItem);
158 oldRow = par->children.indexOf(parentItem);
162 parentItem->groupBox =
new QGroupBox(w);
163 parentItem->layout =
new QGridLayout();
164 parentItem->groupBox->setLayout(parentItem->layout);
165 if (parentItem->label) {
166 l->removeWidget(parentItem->label);
167 delete parentItem->label;
168 parentItem->label =
nullptr;
170 if (parentItem->widget) {
171 l->removeWidget(parentItem->widget);
172 parentItem->widget->setParent(parentItem->groupBox);
173 parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2);
174 parentItem->line =
new QFrame(parentItem->groupBox);
175 }
else if (parentItem->widgetLabel) {
176 l->removeWidget(parentItem->widgetLabel);
177 delete parentItem->widgetLabel;
178 parentItem->widgetLabel =
nullptr;
180 if (parentItem->line) {
181 parentItem->line->setFrameShape(QFrame::HLine);
182 parentItem->line->setFrameShadow(QFrame::Sunken);
183 parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2);
185 l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2);
186 updateItem(parentItem);
188 layout = parentItem->layout;
189 parentWidget = parentItem->groupBox;
192 newItem->label =
new QLabel(parentWidget);
193 newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
194 newItem->widget = createEditor(index->property(), parentWidget);
195 if (!newItem->widget)
196 newItem->widgetLabel =
new QLabel(parentWidget);
198 insertRow(layout, row);
201 layout->addWidget(newItem->widget, row, 1);
202 else if (newItem->widgetLabel)
203 layout->addWidget(newItem->widgetLabel, row, 1);
206 layout->addWidget(newItem->label, row, 0, 1, span);
208 m_itemToIndex[newItem] = index;
209 m_indexToItem[index] = newItem;
216 WidgetItem *item = m_indexToItem.value(index);
218 m_indexToItem.remove(index);
219 m_itemToIndex.remove(item);
226 row = parentItem->children.indexOf(item);
227 parentItem->children.removeAt(row);
228 if (hasHeader(parentItem))
231 row = m_children.indexOf(item);
232 m_children.removeAt(row);
237 delete item->widgetLabel;
238 delete item->groupBox;
241 removeRow(m_mainLayout, row);
242 }
else if (!parentItem->children.empty()) {
243 removeRow(parentItem->layout, row);
246 QGridLayout *l = (par ? par->layout : m_mainLayout);
247 if (parentItem->widget) {
248 parentItem->widget->hide();
249 parentItem->widget->setParent(
nullptr);
250 }
else if (parentItem->widgetLabel) {
251 parentItem->widgetLabel->hide();
252 parentItem->widgetLabel->setParent(
nullptr);
256 l->removeWidget(parentItem->groupBox);
257 delete parentItem->groupBox;
258 parentItem->groupBox =
nullptr;
259 parentItem->line =
nullptr;
260 parentItem->layout =
nullptr;
261 if (!m_recreateQueue.contains(parentItem))
262 m_recreateQueue.append(parentItem);
265 m_recreateQueue.removeAll(item);
272 QHash<QLayoutItem *, QRect> itemToPos;
274 while (idx < layout->count()) {
276 layout->getItemPosition(idx, &r, &c, &rs, &cs);
278 itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
284 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
285 const QRect r = it.value();
286 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
292 QHash<QLayoutItem *, QRect> itemToPos;
294 while (idx < layout->count()) {
296 layout->getItemPosition(idx, &r, &c, &rs, &cs);
298 itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
304 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
305 const QRect r = it.value();
306 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
317 WidgetItem *item = m_indexToItem.value(index);
324 QtProperty *property = m_itemToIndex[item]->property();
325 if (item->groupBox) {
326 QFont font = item->groupBox->font();
328 item->groupBox->setFont(font);
329 item->groupBox->setTitle(property->propertyName());
330 item->groupBox->setToolTip(property->descriptionToolTip());
331 item->groupBox->setStatusTip(property->statusTip());
332 item->groupBox->setWhatsThis(property->whatsThis());
336 QFont font = item->label->font();
338 item->label->setFont(font);
339 item->label->setText(property->propertyName());
340 item->label->setToolTip(property->descriptionToolTip());
341 item->label->setStatusTip(property->statusTip());
342 item->label->setWhatsThis(property->whatsThis());
345 if (item->widgetLabel) {
346 QFont font = item->widgetLabel->font();
347 font.setUnderline(
false);
348 item->widgetLabel->setFont(font);
349 item->widgetLabel->setText(property->valueText());
353 QFont font = item->widget->font();
354 font.setUnderline(
false);
355 item->widget->setFont(font);
357 const QString valueToolTip = property->valueToolTip();
358 item->widget->setToolTip(valueToolTip.isEmpty() ? property->valueText() : valueToolTip);
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
392
395
396
406
407
408
409
410
411
412
413
414
417 for (
auto it = d_ptr->m_itemToIndex.cbegin(), icend = d_ptr->m_itemToIndex.cend(); it != icend; ++it)
422
423
426 d_ptr->propertyInserted(item, afterItem);
430
431
434 d_ptr->propertyRemoved(item);
438
439
442 d_ptr->propertyChanged(item);
447#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.