[Interest] How can I subclass a QDockWidget?
Alex Malyushytskyy
alexmalvtk at gmail.com
Wed Aug 1 03:17:30 CEST 2012
As far as I understand you need 3 different objects
(it can be instances of appropriate class or its subclass) for pattern to work:
1. QMainWindow ( add dock widget to)
2. QDockWidget
3. QWidget ( widget for setWidget which would be displayed by QDockWidget )
And 3 is missing in
> void QScaffy::addView(View *view)
Hope this helps.
Alex
On Mon, Jul 30, 2012 at 9:03 AM, Rollastre Prostrit <rollastre at gmail.com> wrote:
> Hello list.
>
> I'm in kubuntu 12.04 with Qt 4.8.1.
>
> I have a class called View which is a subclass of QDockWidget. In its
> constructor I do this
>
> View::View(QWidget* parent = NULL)
> : QDockWidget(MainWindow::Instance())
> {
> setFeatures(QDockWidget::DockWidgetClosable |
> QDockWidget::DockWidgetMovable);
> }
>
>
>
>
> if I use the following method to add a view to the main window
>
> void QScaffy::addView(View *view)
> {
> view->setParent(w);
>
> qDebug() << "adding view " << view->getViewTitle();
> view->setWindowTitle(view->getViewTitle());
> w->addDockWidget(Qt::LeftDockWidgetArea, view, Qt::Horizontal); //
> where w is a MainWindow (subclass of QMainWindow)
> }
>
> my question is: what am I doing wrong to get a 'segmentation fault' in
> qdockwidget.cpp:414?
>
> int QDockWidgetLayout::minimumTitleWidth() const
> {
> QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
> <---------------- this returns a QWidget and upon the cast q points to 0x0
>
> if (QWidget *title = widgetForRole(TitleBar))
> return pick(verticalTitleBar, title->minimumSizeHint());
>
> QSize closeSize(0, 0);
> QSize floatSize(0, 0);
> if (hasFeature(q, QDockWidget::DockWidgetClosable)) {
> <------------------------------------- Crash HERE
> if (QLayoutItem *item = item_list[CloseButton])
> closeSize = item->widget()->sizeHint();
> }
> if (hasFeature(q, QDockWidget::DockWidgetFloatable)) {
> if (QLayoutItem *item = item_list[FloatButton])
> floatSize = item->widget()->sizeHint();
> }
>
> int titleHeight = this->titleHeight();
>
> int mw = q->style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin,
> 0, q);
> int fw = q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth,
> 0, q);
>
> return pick(verticalTitleBar, closeSize)
> + pick(verticalTitleBar, floatSize)
> + titleHeight + 2*fw + 3*mw;
> }
>
>
>
> However, if my View is just a plain Widget and I manually create a
> QDockWidget like this it works
>
> void QScaffy::addView(QWidget *view)
> {
> QDockWidget *dock = new QDockWidget(tr("New"), w);
> dock->setFeatures(QDockWidget::DockWidgetClosable |
> QDockWidget::DockWidgetMovable);
> dock->setWidget(view);
>
> w->addDockWidget(Qt::LeftDockWidgetArea, dock, Qt::Horizontal);
>
> }
>
>
>
> Do you have any clue what is going on here?
>
> Thanks in advance.
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
More information about the Interest
mailing list