更改其内容时的QDockWidget行为

And*_*y M 2 qt resize qdockwidget

我正面临着我的一个问题QDockWidget.我有几个QWidget项目,QDockwidget有时有时看不到.

我希望我QDockWidget根据其内容调整自己的大小...不仅QWidgets在它出现时,而且当它们消失时......

到目前为止,当我显示QDockWidget更多内容时,我会自行调整大小QWidgets,但是当我让它们消失时,QDockWidget保持在他之前的大小...

有什么想法要帮忙吗?

提前致谢!

use*_*263 6

已经有过关于的大小控制在年各个岗位QDockWidgetQMainWindow码头区.我也一直在努力解决这个问题,并且只能实现部分的,有些不尽如人意的解决方案.主要问题(如果你原谅双关语)是无法控制对接机制从QMainWindow管理其码头区域的工作的上下文.尝试使用布局管理 - 大小策略和大小提示控件 - 无效; 在QMainWindow不断变化的码头区的大小时,做自己的事.

首先,我取得了有限的成功:

QMainWindow子类(MW)和QDockWidget子类(DW)开始.该DWQWidget,有QHBoxLayout,那就是setWidgetDW.这个布局有两个小部件 - 我称之为面板 - 其中一个面板用于显示或隐藏,具体取决于上下文:显示DW在底部或顶部停靠区域或浮动时,否则隐藏.在sizeHint施工后的另一面板的使用(以及适当的余量间距)来设置的"基础尺寸" DW,用构建的sizeHint,这将改变能见度提供增量到基座大小适当时在面板的宽度:该DW实现是提供了一个panel_visible方法,用于通过将setVisible应用于面板并sizeHint通过增量值更改值来启用或禁用变量面板.DW其面板的大小策略设置为Minimum.

MWDW dockLocationChangedtopLevelChanged信号被连接到一个DW_resize时隙.在此,当DW isVisible,isWindow为假,并且MW::dockWidgetArea报告任何LeftDockWidgetAreaRightDockWidgeArea,DW::panel_visible(false)被调用来改变有效DW(当不满足上述条件的大小DW::panel_visible(true)当然是所谓的,).调用DW::resize,并且updateGeometryupdateMW对码头区大小无影响.但是,如果DW::setMaximumSize(DW::sizeHint())被称为停靠区域正确调整大小(没有updateGeometryupdate需要).当DW浮动时(通过拖动或双击其标题栏)然后重新锁定(通过双击其标题栏或将其拖回侧面停靠区域),这可以根据需要工作.到现在为止还挺好.

现在抓住了:

在强制MW使其对接区域适合规定DW尺寸时,DW需要从其固定尺寸约束中释放,因此用户可以通过将由MW中间区域提供的唾液把手拖动到对接区域和中心区域来调整对接区域的大小.显而易见的答案是只是呼吁DW::setMaximumSize(0xFFFFFF, 0xFFFFFF)"释放" DW约束.是的,除了在幕后进行的更新绘画优化合并两个大小调整事件,结果是初始停靠收缩操作丢失.通过在两个调用之间放置一个qApp->sendPostedEvents()并且qApp->flush()在这两个setMaxmimumSize调用之间避免了这种优化效果,停靠区域适合于DW大小然后被释放,因此用户可以调整停靠区域...有时候.

DW通过双击DW标题栏从浮动到停靠时,此解决方案有效,但是当DW拖动到侧面停靠时,此解决方案不起作用MW.因此,例如,如果用户将DW左侧停靠站拖到右侧停靠站,则右侧停靠区域不会按预期调整大小; 接收码头区域仍然DW是从一侧拖到另一侧时产生的浮动区域的大小.如果DW在接收停靠区域中双击其标题栏(再次浮动)然后再次双击(将其返回到相同的停靠区域),则MW现在按预期适合停靠区域.在仔细检查-通过监控MW::paintEvent-我看到,当码头区结束了预期大小flush()后面紧跟着一个paintEvent,其中DW具有预期大小的报告和之后的第二setMaximumSize是unconstrains了DW一个paintEvent与时DW仍预期的大小.但是,当DW被拖进船坞区的flush()再紧接着paintEvent,其中DW具有预期大小的报告,但之后第二个setMaximumSize在这种情况下有两种paintEvents的在DW现在令人惊讶有其先前的浮动大小!

我还没有找到一种方法来防止DW尺寸正确后这种无法解释的大小覆盖.很明显,MWDW_resize插槽处理返回之后,从MW发出信号之前一直保持的大小信息生成了一个额外的调整大小事件,该信息通向了插槽.监视MW::eventFilter确实揭示了DW_resize返回后发生的Resize事件,该事件将其DW大小从插槽代码中设置的大小更改为浮动时的大小.双击DW平铺栏用于将DW浮动窗口移回侧边台时,DW_resize插槽返回后不会发生其他Resize事件.

因此,挑战在于如何防止DWDW_resize插槽中正确调整大小后发生意外的调整大小恢复.也许一些强制DW::resizeEvent将避免这个问题....

当然,更好的是,如果Qt开发人员QMainWindow通过其码头管理活动(特别是码头区域大小调整)和/或访问用于码头区域管理的小部件,为API 应用程序开发人员提供API中的彻底控制.

我目前在Linux,OS X和MS/Windows上使用Qt 4.6.2.上面的调试报告是在Intel OS X 10.6.7系统上完成的; 结果在不同的平台上有所不同,但基本问题是相同的.也许这些QMainWindow/ QDockWidget问题已经在Qt的更高版本中得到了解决?也许有人能够更深入地了解这里发生的事情,并提供一个简单的解决方案?