7#include <QtWidgets/QGridLayout>
8#include <QtWidgets/QGroupBox>
9#include <QtWidgets/QLabel>
16 Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser)
25 {
return q_ptr->createEditor(property, parent); }
44 void insertRow(QGridLayout *layout,
int row)
const;
45 void removeRow(QGridLayout *layout,
int row)
const;
49 QHash<QtBrowserItem *, WidgetItem *> m_indexToItem;
50 QHash<WidgetItem *, QtBrowserItem *> m_itemToIndex;
51 QHash<QWidget *, WidgetItem *> m_widgetToItem;
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 auto *editor = qobject_cast<QWidget *>(q_ptr->sender());
70 if (!m_widgetToItem.contains(editor))
72 m_widgetToItem[editor]->widget =
nullptr;
73 m_widgetToItem.remove(editor);
78 for (WidgetItem *item : std::as_const(m_recreateQueue)) {
79 WidgetItem *par = item->parent;
81 QGridLayout *l =
nullptr;
86 oldRow = m_children.indexOf(item);
90 oldRow = par->children.indexOf(item);
96 item->widget->setParent(w);
97 }
else if (item->widgetLabel) {
98 item->widgetLabel->setParent(w);
100 item->widgetLabel =
new QLabel(w);
104 l->addWidget(item->widget, oldRow, 1, 1, 1);
105 else if (item->widgetLabel)
106 l->addWidget(item->widgetLabel, oldRow, 1, 1, 1);
109 item->label =
new QLabel(w);
110 item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
111 l->addWidget(item->label, oldRow, 0, 1, span);
115 m_recreateQueue.clear();
120 QMetaObject::invokeMethod(q_ptr, [
this] { slotUpdate(); }, Qt::QueuedConnection);
125 WidgetItem *afterItem = m_indexToItem.value(afterIndex);
126 WidgetItem *parentItem = m_indexToItem.value(index->parent());
131 QGridLayout *layout =
nullptr;
132 QWidget *parentWidget =
nullptr;
137 parentItem->children.insert(0, newItem);
139 m_children.insert(0, newItem);
142 row = parentItem->children.indexOf(afterItem) + 1;
143 parentItem->children.insert(row, newItem);
145 row = m_children.indexOf(afterItem) + 1;
146 m_children.insert(row, newItem);
149 if (parentItem && hasHeader(parentItem))
153 layout = m_mainLayout;
154 parentWidget = q_ptr;;
156 if (!parentItem->groupBox) {
157 m_recreateQueue.removeAll(parentItem);
159 QWidget *w =
nullptr;
160 QGridLayout *l =
nullptr;
165 oldRow = m_children.indexOf(parentItem);
169 oldRow = par->children.indexOf(parentItem);
173 parentItem->groupBox =
new QGroupBox(w);
174 parentItem->layout =
new QGridLayout();
175 parentItem->groupBox->setLayout(parentItem->layout);
176 if (parentItem->label) {
177 l->removeWidget(parentItem->label);
178 delete parentItem->label;
179 parentItem->label =
nullptr;
181 if (parentItem->widget) {
182 l->removeWidget(parentItem->widget);
183 parentItem->widget->setParent(parentItem->groupBox);
184 parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2);
185 parentItem->line =
new QFrame(parentItem->groupBox);
186 }
else if (parentItem->widgetLabel) {
187 l->removeWidget(parentItem->widgetLabel);
188 delete parentItem->widgetLabel;
189 parentItem->widgetLabel =
nullptr;
191 if (parentItem->line) {
192 parentItem->line->setFrameShape(QFrame::HLine);
193 parentItem->line->setFrameShadow(QFrame::Sunken);
194 parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2);
196 l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2);
197 updateItem(parentItem);
199 layout = parentItem->layout;
200 parentWidget = parentItem->groupBox;
203 newItem->label =
new QLabel(parentWidget);
204 newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
205 newItem->widget = createEditor(index->property(), parentWidget);
206 if (!newItem->widget) {
207 newItem->widgetLabel =
new QLabel(parentWidget);
209 QObject::connect(newItem->widget, &QWidget::destroyed,
210 q_ptr, [
this] { slotEditorDestroyed(); });
211 m_widgetToItem[newItem->widget] = newItem;
214 insertRow(layout, row);
217 layout->addWidget(newItem->widget, row, 1);
218 else if (newItem->widgetLabel)
219 layout->addWidget(newItem->widgetLabel, row, 1);
222 layout->addWidget(newItem->label, row, 0, 1, span);
224 m_itemToIndex[newItem] = index;
225 m_indexToItem[index] = newItem;
232 WidgetItem *item = m_indexToItem.value(index);
234 m_indexToItem.remove(index);
235 m_itemToIndex.remove(item);
242 row = parentItem->children.indexOf(item);
243 parentItem->children.removeAt(row);
244 if (hasHeader(parentItem))
247 row = m_children.indexOf(item);
248 m_children.removeAt(row);
255 if (item->widgetLabel)
256 delete item->widgetLabel;
258 delete item->groupBox;
261 removeRow(m_mainLayout, row);
262 }
else if (parentItem->children.size() != 0) {
263 removeRow(parentItem->layout, row);
266 QGridLayout *l = (par ? par->layout : m_mainLayout);
267 if (parentItem->widget) {
268 parentItem->widget->hide();
269 parentItem->widget->setParent(0);
270 }
else if (parentItem->widgetLabel) {
271 parentItem->widgetLabel->hide();
272 parentItem->widgetLabel->setParent(0);
276 l->removeWidget(parentItem->groupBox);
277 delete parentItem->groupBox;
278 parentItem->groupBox =
nullptr;
279 parentItem->line =
nullptr;
280 parentItem->layout =
nullptr;
281 if (!m_recreateQueue.contains(parentItem))
282 m_recreateQueue.append(parentItem);
285 m_recreateQueue.removeAll(item);
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());
312 QHash<QLayoutItem *, QRect> itemToPos;
314 while (idx < layout->count()) {
316 layout->getItemPosition(idx, &r, &c, &rs, &cs);
318 itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
324 for (
auto it = itemToPos.cbegin(), icend = itemToPos.cend(); it != icend; ++it) {
325 const QRect r = it.value();
326 layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
337 WidgetItem *item = m_indexToItem.value(index);
344 QtProperty *property = m_itemToIndex[item]->property();
345 if (item->groupBox) {
346 QFont font = item->groupBox->font();
348 item->groupBox->setFont(font);
349 item->groupBox->setTitle(property->propertyName());
350 item->groupBox->setToolTip(property->descriptionToolTip());
351 item->groupBox->setStatusTip(property->statusTip());
352 item->groupBox->setWhatsThis(property->whatsThis());
356 QFont font = item->label->font();
358 item->label->setFont(font);
359 item->label->setText(property->propertyName());
360 item->label->setToolTip(property->descriptionToolTip());
361 item->label->setStatusTip(property->statusTip());
362 item->label->setWhatsThis(property->whatsThis());
365 if (item->widgetLabel) {
366 QFont font = item->widgetLabel->font();
367 font.setUnderline(
false);
368 item->widgetLabel->setFont(font);
369 item->widgetLabel->setText(property->valueText());
373 QFont font = item->widget->font();
374 font.setUnderline(
false);
375 item->widget->setFont(font);
377 const QString valueToolTip = property->valueToolTip();
378 item->widget->setToolTip(valueToolTip.isEmpty() ? property->valueText() : valueToolTip);
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
415
416
426
427
428
429
430
431
432
433
434
437 for (
auto it = d_ptr->m_itemToIndex.cbegin(), icend = d_ptr->m_itemToIndex.cend(); it != icend; ++it)
442
443
446 d_ptr->propertyInserted(item, afterItem);
450
451
454 d_ptr->propertyRemoved(item);
458
459
462 d_ptr->propertyChanged(item);
467#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 slotEditorDestroyed()
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.
void itemChanged(QtBrowserItem *item) override
\reimp
void itemRemoved(QtBrowserItem *item) override
\reimp
void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) override
\reimp
~QtGroupBoxPropertyBrowser()
Destroys this property browser.
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.