QDockWidget导致Qt崩溃。

6
我有安装在Ubuntu 11.10中的Qt版本。现在我想使用一个QDockWidget,但它实际上不能停靠(基本上,我只是想要一个浮动的窗口。我不想将视图作为顶级视图,因为那样我就会有操作系统窗口栏,而我不想要它,如果我隐藏它,那么窗口就无法移动)。
所以,我基本上创建了一个新的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 中的一个 bug。


我得到了相同的结果,而且我找不到任何文件说明为什么它不起作用。这可能是一个错误。 - Arnold Spence
1个回答

8

您将小部件设为浮动但不可漂浮。

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();

+1 这确实在我的端上防止了崩溃,尽管我仍然认为崩溃是一个 bug。 - Arnold Spence
这个可以用,但有没有办法去掉左上角的那个停靠按钮?因为它无处可停靠,所以它没有任何作用,而且看起来很丑。谢谢。 - Leif Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接