代码之家  ›  专栏  ›  技术社区  ›  Zac

C++以编程方式调整对接的QtQDOKWIDGET?

  •  25
  • Zac  · 技术社区  · 16 年前

    QDockWidget 更小。例如,此代码段创建了我的底部停靠窗口“Build Information”:

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

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

    Actual

    Expected

    我好像不能让这发生。QDockWidget上的Qt引用说明:

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

    现在,这意味着一种方法是对子类进行分类 QTextEdit 并覆盖 sizeHint() 方法。然而,我不希望仅仅为了这个目的而这样做,也没有试图找到一个有效的解决办法。

    dock->resize(m_compilerOutput->width(), m_compilerOutput->minimumHeight()) ,呼叫 m_compilerOutput->setSizePolicy() 每一个选项。。。到目前为止,还没有什么影响到它的大小。就像我说的,我更喜欢用几行代码的简单解决方案,而不是创建一个子类来进行更改 大小提示() . 感谢您的建议。

    9 回复  |  直到 13 年前
        1
  •  5
  •   Charl Botha    13 年前

    我也经历了同样的过程。在尝试了太多的 resize() , adjustSize() 还有dock小部件上的朋友和他们包含的小部件,这些都不起作用,我最终子类化了 QListView 再加上 sizeHint() 方法。

    现在它就像一个魔咒。

        2
  •  8
  •   semenvx    14 年前

    我做的很简单: 标题:

    private void setDockSize(QDockWidget *dock, int, int);
      public slots:
      void returnToOldMaxMinSizes();
    

    资料来源:

    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);
    }
    
        3
  •  6
  •   TreDubZedd    16 年前

    考虑到它的子小部件,这听起来像是dock小部件将自己的大小重新调整到了合适的大小。从QDockWidget文档(我的重点):

    QDockWidget充当其子小部件的包装器,用setWidget()设置。自定义尺寸提示,最小和最大尺寸和 . QDockWidget将尊重它们,调整自己的约束以包括框架和标题。不应该对QDockWidget本身设置大小限制,因为它们会根据它是否停靠而改变;停靠的QDockWidget没有框架和较小的标题栏。

    为了更改大小,必须重新调整子小部件的大小。

    编辑:Qt文档在讨论尺寸提示时有时可能会产生误导。通常,它指的是任何类型的调整大小,无论是由小部件自动执行还是编程执行。

        4
  •  6
  •   Community Mohan Dere    9 年前

    这是一个老问题,但我想顺便提一下,qt5.6引入了 QMainWindow::resizeDocks

    不幸的是,它不适用于 my use case (在使用QMainWindows::splitDockWidget拆分的两个QDockWidget之间移动分隔符)

        5
  •  2
  •   Kitsune SpiderShlong    16 年前

    resize() 上 QTextEdit 在你的dock widget里?您还可以尝试临时设置dock小部件的最大值;将最小大小设置为您希望的大小,然后恢复原始值。

        6
  •  2
  •   thuga    13 年前

    为你的身体设定一个最大高度 QTextEdit :

    m_compilerOutput = new QTextEdit;
    m_compilerOutput->setMaximumHeight(100);
    

    然后在 show event 把它放回原来的大小或者高一些:

    void MainWindow::showEvent(QShowEvent *)
    {
       m_compilerOutput->setMaximumHeight(10000);
    }
    

    这就是你所需要的。

        7
  •  1
  •   Chandra Sekhar    14 年前

    QDockWidget::widget() (即 QDockWidget (正在管理)未按预期持续工作。

    用一个 QDockWidget工具 子类(DW),其中 QWidget 用一个 QHBoxLayout 左面板和右面板 )此外,所有这些公司的规模策略都设置为 QSizePolicy::Minimum ,DW通常有两个面板小部件可见。当DW放置在侧坞中时,应用程序( QMainWindow )处理数据仓库的插槽 dockLocationChanged DW->widget() 到右面板的大小。当DW以编程方式移动到底部停靠区域时,leftPanel设置为可见,DW填充主窗口的整个宽度(当然)。当DW然后以编程方式移动到侧坞区域时,左侧面板被隐藏,DW被重新调整大小。这是按计划进行的。但是,如果DW从底部驳接区域拖到侧驳接区域,尽管左侧面板被隐藏,并且像以前一样应用了重新调整大小,但DW不会像通过编程完成重新定位时那样向下调整大小。通过在DW和主窗口中心区域之间拖动拆分器手柄,可以手动调整DW的大小。请注意,主窗口中心区域是 QWidget工具 QHBox布局 有大小规则 QSizePolicy::Expanding

    adjustSize 在主窗口上重新调整DW的大小后没有效果。尽管DW已经重新实施 sizeHint 根据左侧面板是否可见返回其最小大小。

    要么我在如何控制 (考虑到我在理解布局管理系统各部分之间的所有交互方面遇到的困难,这是很有可能的),或者 Q主窗口 正在忽略或重写正在给定的布局指令。在测试过程中仔细检查事件流 重新定位操作建议后者:在插槽处理 码头位置已更改 Q主窗口 QDockWidget工具 从而撤消试图控制驳接大小的应用程序逻辑。这件事似乎有点不对劲 Q主窗口 ....

        8
  •  1
  •   Martin Evans    9 年前

    QMainWindow::resizeDocks 功能。

    如果是浮动的,大小由孩子决定。 为了达到你的目的。

        9
  •  0
  •   vrogach    11 年前

    QTBUG-16252中描述了主窗口最大化时dock窗口小部件的大小调整问题( https://bugreports.qt.io/browse/QTBUG-16252

    我找到了另一个解决办法。适用于Windows7上的Qt5.4.1 minGW。 看起来一些小部件状态恢复操作与QApplication事件循环密切相关。

    只有满足以下条件时,DockWidget大小才能正确恢复:

    1. restoreState()在exec()之后调用(例如,通过QTimer)

    这是我的密码:

    int main(int argc, char *argv[])
    {
        QApplication application(argc, argv);
    
        //...
    
        MainWindow mainWindow;
        mainWindow.show();
    
        return application.exec();
    }
    
    MainWindow::MainWindow(...) 
    {
        ui->setupUi(this);
    
        //...
        QTimer* nt = new QTimer(this);
    
        nt->setSingleShot(true);
        nt->setInterval( 100 );
    
        connect(nt, SIGNAL(timeout()), SLOT(restoreWidgetSettings()));
        nt->connect(nt, SIGNAL(timeout()), SLOT(deleteLater()));
    
        nt->start();
    
        restoreWidgetSettings(true);
    }
    
    void MainWindow::restoreWidgetSettings(bool geometryOnly) {
    
        //...
        QByteArray geometry = getSettings();
    
        restoreGeometry(geometry);
    
        if(geometryOnly)
            return;
    
        //... //create dock widgets here
    
        restoreState(mainWindowState);
    
    }