C++以编程方式调整停靠的Qt QDockWidget的大小?

Zac*_*Zac 26 c++ qt resize qdockwidget

我刚刚开始研究一个新的C++/Qt项目.它将是一个基于MDI的IDE,带有停靠的小部件,用于文件树,对象浏览器,编译器输出等等.但是到目前为止,有一件事让我烦恼:我无法弄清楚如何以编程方式QDockWidget缩小.例如,此代码段创建了我的底部停靠窗口"构建信息":

m_compilerOutput = new QTextEdit;
m_compilerOutput->setReadOnly(true);
dock = new QDockWidget(tr("Build Information"), this);
dock->setWidget(m_compilerOutput);
addDockWidget(Qt::BottomDockWidgetArea, dock);
Run Code Online (Sandbox Code Playgroud)

启动时,我的程序看起来像这样(记住开发的早期阶段):

实际

但是,我希望它看起来像这样:

预期

我似乎无法实现这一点.QDockWidget上的Qt参考说明了这一点:

应在子窗口小部件中实现自定义大小提示,最小和最大大小和大小策略.QDockWidget将尊重它们,调整自己的约束以包含框架和标题.不应在QDockWidget本身上设置大小约束,因为它们会根据是否停靠而更改

现在,这表明执行此操作的一种方法是子类QTextEdit并覆盖该sizeHint()方法.但是,我不想仅仅为此目的这样做,我也没有尝试过它来找到一个有效的解决方案.

我试过打电话dock->resize(m_compilerOutput->width(), m_compilerOutput->minimumHeight()),m_compilerOutput->setSizePolicy()用它的每个选项打电话......到目前为止,没有任何东西影响了它的大小.就像我说的,我更喜欢在几行代码中使用一个简单的解决方案来创建一个只是为了改变的子类sizeHint().所有建议表示赞赏.

小智 7

我很轻松:HEADER:

private void setDockSize(QDockWidget *dock, int, int);
  public slots:
  void returnToOldMaxMinSizes();
Run Code Online (Sandbox Code Playgroud)

资源:

QSize oldMaxSize, oldMinSize;

void MainWindow::setDockSize(QDockWidget* dock, int setWidth,int setHeight)
{

    oldMaxSize=dock->maximumSize();
    oldMinSize=dock->minimumSize();

  if (setWidth>=0)
    if (dock->width()<setWidth)
        dock->setMinimumWidth(setWidth);
    else dock->setMaximumWidth(setWidth);
  if (setHeight>=0)
    if (dock->height()<setHeight)
        dock->setMinimumHeight(setHeight);
    else dock->setMaximumHeight(setHeight);

    QTimer::singleShot(1, this, SLOT(returnToOldMaxMinSizes()));
}

void MainWindow::returnToOldMaxMinSizes()
{
    ui->dockWidget->setMinimumSize(oldMinSize);
    ui->dockWidget->setMaximumSize(oldMaxSize);
}
Run Code Online (Sandbox Code Playgroud)

  • 可以将`QTimer :: singleShot`调用替换为`qApp-> processEvents()`.以同样的方式工作.即使这是一个讨厌的hack_,这是我发现在Qt中调整停靠小部件的唯一方法. (3认同)

Tre*_*edd 6

听起来它的子窗口小部件听起来像停靠窗口小部件重新调整大小到适当的大小.从QDockWidget文档(强调我的):

QDockWidget充当其子窗口小部件的包装器,使用setWidget()进行设置.应在子窗口小部件中实现自定义大小提示,最小和最大大小和大小策略.QDockWidget将尊重它们,调整自己的约束以包含框架和标题.不应该在QDockWidget本身上设置大小约束,因为它们会根据它停靠的方式而改变; 停靠的QDockWidget没有框架和较小的标题栏.

为了更改大小,您必须重新调整子窗口小部件的大小.

编辑:Qt文档在讨论大小提示时有时会产生误导.通常,它指的是任何类型的大小调整,无论是由窗口小部件自动执行还是以编程方式执行.


Ale*_*erg 6

这是一个老问题,但是我想提一提Qt 5.6引入了QMainWindow :: resizeDocks函数来处理此问题。

不幸的是,它不适用于我的用例(在已经用QMainWindows :: splitDockWidget拆分的两个QDockWidget之间移动分隔符)


Cha*_*tha 5

我刚刚经历了同样的过程。在尝试了太多的resize(),adjustSize()和停靠小部件及其包含的小部件上的朋友的排列后,没有一个起作用,我最终继承QListView并添加了该sizeHint()方法。

现在它就像一个魅力。