【问题标题】:QDockWidget causes qt to crashQDockWidget 导致 qt 崩溃
【发布时间】:2012-03-22 12:18:24
【问题描述】:

我有 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 中的一个错误。

【问题讨论】:

  • 我得到了相同的结果,但我找不到任何说明它为什么不起作用的文档。这可能是一个错误。

标签: c++ qt qt4 qdockwidget


【解决方案1】:

您使小部件浮动但不能浮动。

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 这确实阻止了我的崩溃,尽管我仍然认为崩溃是一个错误。
  • 这行得通,但有没有办法摆脱左上角的停靠按钮?由于它没有停靠的地方,它什么也不做,而且看起来很丑。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多