QDockWidget导致qt崩溃

时间:2012-03-04 23:01:11

标签: c++ qt qt4 qdockwidget

我拥有内置于ubuntu 11.10中的Qt版本。我试图使用一个无法实际停靠的QDockWidget(基本上,我只是想要一个漂浮的窗口。我不想让视图成为顶级视图,因为那时我会有OS窗口栏在那里,我不想要,如果我要隐藏它,那么窗口将不会移动。)

所以,我基本上创建一个新的Qt Gui项目,并且不要更改任何文件,除了mainwindow.cpp文件,我改为:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDockWidget>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QDockWidget *dockWidget = new QDockWidget(this);
    // Without window management and attached to mainwindow (central widget)
    dockWidget->setFloating( true );
    // resize by frame only - not positional moveable
    dockWidget->setFeatures( QDockWidget::DockWidgetMovable );
    // never dock in mainwindow
    dockWidget->setAllowedAreas( Qt::NoDockWidgetArea );
    // title
    dockWidget->setWindowTitle( "Dock Widget" );
    // add contents. etc etc....
    dockWidget->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

问题在于,当我去移动小部件时,整个程序崩溃了。我想知道我做错了什么,或者qt中是否只有一个错误。

1 个答案:

答案 0 :(得分:7)

你让小部件浮动但不可浮动。

dockWidget->setFeatures( QDockWidget::DockWidgetMovable | 
    QDockWidget::DockWidgetFloatable );

您还可以通过处理鼠标拖动mousePressEventmouseReleaseEventmouseMoveEvent来设置可移动的无框窗口。

<小时/>

如何隐藏现在无用的浮动按钮

基于QDockWidget源代码,如果有标题栏小部件,则不会显示“浮动按钮”:

 dockWidget->setTitleBarWidget(new QLabel("Dock Widget", dockWidget));

或者由于它有一个名称(未记录),您可以明确地隐藏它:

 QAbstractButton * floatButton = 
   dockWidget->findChild<QAbstractButton*>("qt_dockwidget_floatbutton");
 if(floatButton) 
     floatButton->hide();