qtgroupboxpropertybrowser.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the Qt Solutions component.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 ** * Redistributions of source code must retain the above copyright
15 ** notice, this list of conditions and the following disclaimer.
16 ** * Redistributions in binary form must reproduce the above copyright
17 ** notice, this list of conditions and the following disclaimer in
18 ** the documentation and/or other materials provided with the
19 ** distribution.
20 ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 ** of its contributors may be used to endorse or promote products derived
22 ** from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 
43 #include <QSet>
44 #include <QGridLayout>
45 #include <QLabel>
46 #include <QGroupBox>
47 #include <QTimer>
48 #include <QMap>
49 
50 QT_BEGIN_NAMESPACE
51 
53 {
55  Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser)
56 public:
57 
58  void init(QWidget* parent);
59 
63  QWidget* createEditor(QtProperty* property, QWidget* parent) const
64  {
65  return q_ptr->createEditor(property, parent);
66  }
67 
68  void slotEditorDestroyed();
69  void slotUpdate();
70 
71  struct WidgetItem
72  {
73  WidgetItem() : widget(0), label(0), widgetLabel(0),
74  groupBox(0), layout(0), line(0), parent(0) { }
75  QWidget* widget; // can be null
76  QLabel* label;
77  QLabel* widgetLabel;
78  QGroupBox* groupBox;
79  QGridLayout* layout;
80  QFrame* line;
82  QList<WidgetItem*> children;
83  };
84 private:
85  void updateLater();
86  void updateItem(WidgetItem* item);
87  void insertRow(QGridLayout* layout, int row) const;
88  void removeRow(QGridLayout* layout, int row) const;
89 
90  bool hasHeader(WidgetItem* item) const;
91 
92  QMap<QtBrowserItem*, WidgetItem*> m_indexToItem;
93  QMap<WidgetItem*, QtBrowserItem*> m_itemToIndex;
94  QMap<QWidget*, WidgetItem*> m_widgetToItem;
95  QGridLayout* m_mainLayout;
96  QList<WidgetItem*> m_children;
97  QList<WidgetItem*> m_recreateQueue;
98 };
99 
101 {
102  m_mainLayout = new QGridLayout();
103  parent->setLayout(m_mainLayout);
104  QLayoutItem* item = new QSpacerItem(0, 0,
105  QSizePolicy::Fixed, QSizePolicy::Expanding);
106  m_mainLayout->addItem(item, 0, 0);
107 }
108 
110 {
111  QWidget* editor = qobject_cast<QWidget*>(q_ptr->sender());
112 
113  if (!editor)
114  {
115  return;
116  }
117 
118  if (!m_widgetToItem.contains(editor))
119  {
120  return;
121  }
122 
123  m_widgetToItem[editor]->widget = 0;
124  m_widgetToItem.remove(editor);
125 }
126 
128 {
129  QListIterator<WidgetItem*> itItem(m_recreateQueue);
130 
131  while (itItem.hasNext())
132  {
133  WidgetItem* item = itItem.next();
134 
135  WidgetItem* par = item->parent;
136  QWidget* w = 0;
137  QGridLayout* l = 0;
138  int oldRow = -1;
139 
140  if (!par)
141  {
142  w = q_ptr;
143  l = m_mainLayout;
144  oldRow = m_children.indexOf(item);
145  }
146  else
147  {
148  w = par->groupBox;
149  l = par->layout;
150  oldRow = par->children.indexOf(item);
151 
152  if (hasHeader(par))
153  {
154  oldRow += 2;
155  }
156  }
157 
158  if (item->widget)
159  {
160  item->widget->setParent(w);
161  }
162  else if (item->widgetLabel)
163  {
164  item->widgetLabel->setParent(w);
165  }
166  else
167  {
168  item->widgetLabel = new QLabel(w);
169  item->widgetLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
170  item->widgetLabel->setTextFormat(Qt::PlainText);
171  }
172 
173  int span = 1;
174 
175  if (item->widget)
176  {
177  l->addWidget(item->widget, oldRow, 1, 1, 1);
178  }
179  else if (item->widgetLabel)
180  {
181  l->addWidget(item->widgetLabel, oldRow, 1, 1, 1);
182  }
183  else
184  {
185  span = 2;
186  }
187 
188  item->label = new QLabel(w);
189  item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
190  l->addWidget(item->label, oldRow, 0, 1, span);
191 
192  updateItem(item);
193  }
194 
195  m_recreateQueue.clear();
196 }
197 
198 void QtGroupBoxPropertyBrowserPrivate::updateLater()
199 {
200  QTimer::singleShot(0, q_ptr, SLOT(slotUpdate()));
201 }
202 
204 {
205  WidgetItem* afterItem = m_indexToItem.value(afterIndex);
206  WidgetItem* parentItem = m_indexToItem.value(index->parent());
207 
208  WidgetItem* newItem = new WidgetItem();
209  newItem->parent = parentItem;
210 
211  QGridLayout* layout = 0;
212  QWidget* parentWidget = 0;
213  int row = -1;
214 
215  if (!afterItem)
216  {
217  row = 0;
218 
219  if (parentItem)
220  {
221  parentItem->children.insert(0, newItem);
222  }
223  else
224  {
225  m_children.insert(0, newItem);
226  }
227  }
228  else
229  {
230  if (parentItem)
231  {
232  row = parentItem->children.indexOf(afterItem) + 1;
233  parentItem->children.insert(row, newItem);
234  }
235  else
236  {
237  row = m_children.indexOf(afterItem) + 1;
238  m_children.insert(row, newItem);
239  }
240  }
241 
242  if (parentItem && hasHeader(parentItem))
243  {
244  row += 2;
245  }
246 
247  if (!parentItem)
248  {
249  layout = m_mainLayout;
250  parentWidget = q_ptr;;
251  }
252  else
253  {
254  if (!parentItem->groupBox)
255  {
256  m_recreateQueue.removeAll(parentItem);
257  WidgetItem* par = parentItem->parent;
258  QWidget* w = 0;
259  QGridLayout* l = 0;
260  int oldRow = -1;
261 
262  if (!par)
263  {
264  w = q_ptr;
265  l = m_mainLayout;
266  oldRow = m_children.indexOf(parentItem);
267  }
268  else
269  {
270  w = par->groupBox;
271  l = par->layout;
272  oldRow = par->children.indexOf(parentItem);
273 
274  if (hasHeader(par))
275  {
276  oldRow += 2;
277  }
278  }
279 
280  parentItem->groupBox = new QGroupBox(w);
281  parentItem->layout = new QGridLayout();
282  parentItem->groupBox->setLayout(parentItem->layout);
283 
284  if (parentItem->label)
285  {
286  l->removeWidget(parentItem->label);
287  delete parentItem->label;
288  parentItem->label = 0;
289  }
290 
291  if (parentItem->widget)
292  {
293  l->removeWidget(parentItem->widget);
294  parentItem->widget->setParent(parentItem->groupBox);
295  parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2);
296  parentItem->line = new QFrame(parentItem->groupBox);
297  }
298  else if (parentItem->widgetLabel)
299  {
300  l->removeWidget(parentItem->widgetLabel);
301  delete parentItem->widgetLabel;
302  parentItem->widgetLabel = 0;
303  }
304 
305  if (parentItem->line)
306  {
307  parentItem->line->setFrameShape(QFrame::HLine);
308  parentItem->line->setFrameShadow(QFrame::Sunken);
309  parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2);
310  }
311 
312  l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2);
313  updateItem(parentItem);
314  }
315 
316  layout = parentItem->layout;
317  parentWidget = parentItem->groupBox;
318  }
319 
320  newItem->label = new QLabel(parentWidget);
321  newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
322  newItem->widget = createEditor(index->property(), parentWidget);
323 
324  if (!newItem->widget)
325  {
326  newItem->widgetLabel = new QLabel(parentWidget);
327  newItem->widgetLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
328  newItem->widgetLabel->setTextFormat(Qt::PlainText);
329  }
330  else
331  {
332  QObject::connect(newItem->widget, SIGNAL(destroyed()), q_ptr, SLOT(slotEditorDestroyed()));
333  m_widgetToItem[newItem->widget] = newItem;
334  }
335 
336  insertRow(layout, row);
337  int span = 1;
338 
339  if (newItem->widget)
340  {
341  layout->addWidget(newItem->widget, row, 1);
342  }
343  else if (newItem->widgetLabel)
344  {
345  layout->addWidget(newItem->widgetLabel, row, 1);
346  }
347  else
348  {
349  span = 2;
350  }
351 
352  layout->addWidget(newItem->label, row, 0, 1, span);
353 
354  m_itemToIndex[newItem] = index;
355  m_indexToItem[index] = newItem;
356 
357  updateItem(newItem);
358 }
359 
361 {
362  WidgetItem* item = m_indexToItem.value(index);
363 
364  m_indexToItem.remove(index);
365  m_itemToIndex.remove(item);
366 
367  WidgetItem* parentItem = item->parent;
368 
369  int row = -1;
370 
371  if (parentItem)
372  {
373  row = parentItem->children.indexOf(item);
374  parentItem->children.removeAt(row);
375 
376  if (hasHeader(parentItem))
377  {
378  row += 2;
379  }
380  }
381  else
382  {
383  row = m_children.indexOf(item);
384  m_children.removeAt(row);
385  }
386 
387  if (item->widget)
388  {
389  delete item->widget;
390  }
391 
392  if (item->label)
393  {
394  delete item->label;
395  }
396 
397  if (item->widgetLabel)
398  {
399  delete item->widgetLabel;
400  }
401 
402  if (item->groupBox)
403  {
404  delete item->groupBox;
405  }
406 
407  if (!parentItem)
408  {
409  removeRow(m_mainLayout, row);
410  }
411  else if (parentItem->children.count() != 0)
412  {
413  removeRow(parentItem->layout, row);
414  }
415  else
416  {
417  WidgetItem* par = parentItem->parent;
418  QGridLayout* l = 0;
419  int oldRow = -1;
420 
421  if (!par)
422  {
423  l = m_mainLayout;
424  oldRow = m_children.indexOf(parentItem);
425  }
426  else
427  {
428  l = par->layout;
429  oldRow = par->children.indexOf(parentItem);
430 
431  if (hasHeader(par))
432  {
433  oldRow += 2;
434  }
435  }
436 
437  if (parentItem->widget)
438  {
439  parentItem->widget->hide();
440  parentItem->widget->setParent(0);
441  }
442  else if (parentItem->widgetLabel)
443  {
444  parentItem->widgetLabel->hide();
445  parentItem->widgetLabel->setParent(0);
446  }
447  else
448  {
449  //parentItem->widgetLabel = new QLabel(w);
450  }
451 
452  l->removeWidget(parentItem->groupBox);
453  delete parentItem->groupBox;
454  parentItem->groupBox = 0;
455  parentItem->line = 0;
456  parentItem->layout = 0;
457 
458  if (!m_recreateQueue.contains(parentItem))
459  {
460  m_recreateQueue.append(parentItem);
461  }
462 
463  updateLater();
464  }
465 
466  m_recreateQueue.removeAll(item);
467 
468  delete item;
469 }
470 
471 void QtGroupBoxPropertyBrowserPrivate::insertRow(QGridLayout* layout, int row) const
472 {
473  QMap<QLayoutItem*, QRect> itemToPos;
474  int idx = 0;
475 
476  while (idx < layout->count())
477  {
478  int r, c, rs, cs;
479  layout->getItemPosition(idx, &r, &c, &rs, &cs);
480 
481  if (r >= row)
482  {
483  itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
484  }
485  else
486  {
487  idx++;
488  }
489  }
490 
491  const QMap<QLayoutItem*, QRect>::ConstIterator icend = itemToPos.constEnd();
492 
493  for (QMap<QLayoutItem*, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it)
494  {
495  const QRect r = it.value();
496  layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
497  }
498 }
499 
500 void QtGroupBoxPropertyBrowserPrivate::removeRow(QGridLayout* layout, int row) const
501 {
502  QMap<QLayoutItem*, QRect> itemToPos;
503  int idx = 0;
504 
505  while (idx < layout->count())
506  {
507  int r, c, rs, cs;
508  layout->getItemPosition(idx, &r, &c, &rs, &cs);
509 
510  if (r > row)
511  {
512  itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
513  }
514  else
515  {
516  idx++;
517  }
518  }
519 
520  const QMap<QLayoutItem*, QRect>::ConstIterator icend = itemToPos.constEnd();
521 
522  for (QMap<QLayoutItem*, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it)
523  {
524  const QRect r = it.value();
525  layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
526  }
527 }
528 
529 bool QtGroupBoxPropertyBrowserPrivate::hasHeader(WidgetItem* item) const
530 {
531  if (item->widget)
532  {
533  return true;
534  }
535 
536  return false;
537 }
538 
540 {
541  WidgetItem* item = m_indexToItem.value(index);
542 
543  updateItem(item);
544 }
545 
546 void QtGroupBoxPropertyBrowserPrivate::updateItem(WidgetItem* item)
547 {
548  QtProperty* property = m_itemToIndex[item]->property();
549 
550  if (item->groupBox)
551  {
552  QFont font = item->groupBox->font();
553  font.setUnderline(property->isModified());
554  item->groupBox->setFont(font);
555  item->groupBox->setTitle(property->propertyName());
556  item->groupBox->setToolTip(property->toolTip());
557  item->groupBox->setStatusTip(property->statusTip());
558  item->groupBox->setWhatsThis(property->whatsThis());
559  item->groupBox->setEnabled(property->isEnabled());
560  }
561 
562  if (item->label)
563  {
564  QFont font = item->label->font();
565  font.setUnderline(property->isModified());
566  item->label->setFont(font);
567  item->label->setText(property->propertyName());
568  item->label->setToolTip(property->toolTip());
569  item->label->setStatusTip(property->statusTip());
570  item->label->setWhatsThis(property->whatsThis());
571  item->label->setEnabled(property->isEnabled());
572  }
573 
574  if (item->widgetLabel)
575  {
576  QFont font = item->widgetLabel->font();
577  font.setUnderline(false);
578  item->widgetLabel->setFont(font);
579  item->widgetLabel->setText(property->valueText());
580  item->widgetLabel->setToolTip(property->valueText());
581  item->widgetLabel->setEnabled(property->isEnabled());
582  }
583 
584  if (item->widget)
585  {
586  QFont font = item->widget->font();
587  font.setUnderline(false);
588  item->widget->setFont(font);
589  item->widget->setEnabled(property->isEnabled());
590  item->widget->setToolTip(property->valueText());
591  }
592 
593  //item->setIcon(1, property->valueIcon());
594 }
595 
596 
597 
598 /*!
599  \class QtGroupBoxPropertyBrowser
600 
601  \brief The QtGroupBoxPropertyBrowser class provides a QGroupBox
602  based property browser.
603 
604  A property browser is a widget that enables the user to edit a
605  given set of properties. Each property is represented by a label
606  specifying the property's name, and an editing widget (e.g. a line
607  edit or a combobox) holding its value. A property can have zero or
608  more subproperties.
609 
610  QtGroupBoxPropertyBrowser provides group boxes for all nested
611  properties, i.e. subproperties are enclosed by a group box with
612  the parent property's name as its title. For example:
613 
614  \image qtgroupboxpropertybrowser.png
615 
616  Use the QtAbstractPropertyBrowser API to add, insert and remove
617  properties from an instance of the QtGroupBoxPropertyBrowser
618  class. The properties themselves are created and managed by
619  implementations of the QtAbstractPropertyManager class.
620 
621  \sa QtTreePropertyBrowser, QtAbstractPropertyBrowser
622 */
623 
624 /*!
625  Creates a property browser with the given \a parent.
626 */
628  : QtAbstractPropertyBrowser(parent)
629 {
631  d_ptr->q_ptr = this;
632 
633  d_ptr->init(this);
634 }
635 
636 /*!
637  Destroys this property browser.
638 
639  Note that the properties that were inserted into this browser are
640  \e not destroyed since they may still be used in other
641  browsers. The properties are owned by the manager that created
642  them.
643 
644  \sa QtProperty, QtAbstractPropertyManager
645 */
647 {
648  const QMap<QtGroupBoxPropertyBrowserPrivate::WidgetItem*, QtBrowserItem*>::ConstIterator icend = d_ptr->m_itemToIndex.constEnd();
649 
650  for (QMap<QtGroupBoxPropertyBrowserPrivate::WidgetItem*, QtBrowserItem*>::ConstIterator it = d_ptr->m_itemToIndex.constBegin(); it != icend; ++it)
651  {
652  delete it.key();
653  }
654 
655  delete d_ptr;
656 }
657 
658 /*!
659  \reimp
660 */
662 {
663  d_ptr->propertyInserted(item, afterItem);
664 }
665 
666 /*!
667  \reimp
668 */
670 {
671  d_ptr->propertyRemoved(item);
672 }
673 
674 /*!
675  \reimp
676 */
678 {
679  d_ptr->propertyChanged(item);
680 }
681 
682 QT_END_NAMESPACE
683 
684 #include "moc_qtgroupboxpropertybrowser.cpp"
QtGroupBoxPropertyBrowserPrivate::slotEditorDestroyed
void slotEditorDestroyed()
Definition: qtgroupboxpropertybrowser.cpp:109
QtGroupBoxPropertyBrowserPrivate::WidgetItem::line
QFrame * line
Definition: qtgroupboxpropertybrowser.cpp:118
index
uint8_t index
Definition: EtherCATFrame.h:59
QtGroupBoxPropertyBrowserPrivate::WidgetItem::parent
WidgetItem * parent
Definition: qtgroupboxpropertybrowser.cpp:119
QtGroupBoxPropertyBrowser::itemInserted
void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) override
Definition: qtgroupboxpropertybrowser.cpp:661
QtAbstractPropertyBrowser
QtAbstractPropertyBrowser provides a base class for implementing property browsers.
Definition: qtpropertybrowser.h:289
QtGroupBoxPropertyBrowser::QtGroupBoxPropertyBrowser
QtGroupBoxPropertyBrowser(QWidget *parent=0)
Definition: qtgroupboxpropertybrowser.cpp:627
QtGroupBoxPropertyBrowserPrivate::WidgetItem::WidgetItem
WidgetItem()
Definition: qtgroupboxpropertybrowser.cpp:111
QtGroupBoxPropertyBrowser::itemChanged
void itemChanged(QtBrowserItem *item) override
Definition: qtgroupboxpropertybrowser.cpp:677
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:43
QtBrowserItem
The QtBrowserItem class represents a property in a property browser instance.
Definition: qtpropertybrowser.h:273
QtProperty
The QtProperty class encapsulates an instance of a property.
Definition: qtpropertybrowser.h:71
QtAbstractPropertyBrowser::createEditor
virtual QWidget * createEditor(QtProperty *property, QWidget *parent)
Definition: qtpropertybrowser.cpp:2096
QtGroupBoxPropertyBrowserPrivate::WidgetItem::layout
QGridLayout * layout
Definition: qtgroupboxpropertybrowser.cpp:117
QtGroupBoxPropertyBrowserPrivate::slotUpdate
void slotUpdate()
Definition: qtgroupboxpropertybrowser.cpp:127
QtGroupBoxPropertyBrowser
The QtGroupBoxPropertyBrowser class provides a QGroupBox based property browser.
Definition: qtgroupboxpropertybrowser.h:50
QtGroupBoxPropertyBrowserPrivate::WidgetItem::widgetLabel
QLabel * widgetLabel
Definition: qtgroupboxpropertybrowser.cpp:115
qtgroupboxpropertybrowser.h
QtGroupBoxPropertyBrowserPrivate::WidgetItem::widget
QWidget * widget
Definition: qtgroupboxpropertybrowser.cpp:113
QtGroupBoxPropertyBrowserPrivate::WidgetItem::children
QList< WidgetItem * > children
Definition: qtgroupboxpropertybrowser.cpp:120
QtGroupBoxPropertyBrowserPrivate::WidgetItem
Definition: qtgroupboxpropertybrowser.cpp:109
QtGroupBoxPropertyBrowserPrivate::createEditor
QWidget * createEditor(QtProperty *property, QWidget *parent) const
Definition: qtgroupboxpropertybrowser.cpp:101
QtGroupBoxPropertyBrowserPrivate::WidgetItem::label
QLabel * label
Definition: qtgroupboxpropertybrowser.cpp:114
QtGroupBoxPropertyBrowserPrivate::propertyInserted
void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
Definition: qtgroupboxpropertybrowser.cpp:203
QtGroupBoxPropertyBrowserPrivate::propertyRemoved
void propertyRemoved(QtBrowserItem *index)
Definition: qtgroupboxpropertybrowser.cpp:360
QtGroupBoxPropertyBrowser::itemRemoved
void itemRemoved(QtBrowserItem *item) override
Definition: qtgroupboxpropertybrowser.cpp:669
QtGroupBoxPropertyBrowser::~QtGroupBoxPropertyBrowser
~QtGroupBoxPropertyBrowser() override
Definition: qtgroupboxpropertybrowser.cpp:646
QtGroupBoxPropertyBrowserPrivate::propertyChanged
void propertyChanged(QtBrowserItem *index)
Definition: qtgroupboxpropertybrowser.cpp:539
QtGroupBoxPropertyBrowserPrivate::WidgetItem::groupBox
QGroupBox * groupBox
Definition: qtgroupboxpropertybrowser.cpp:116
QtGroupBoxPropertyBrowserPrivate::init
void init(QWidget *parent)
Definition: qtgroupboxpropertybrowser.cpp:100
QtGroupBoxPropertyBrowserPrivate
Definition: qtgroupboxpropertybrowser.cpp:52