参考博文:
QDockWidget嵌套布局详解-实现Visual Studio布局
开源代码示例:
Qt-Advanced-Docking-System
一.常用问题记录
1.1 拖动问题
QMainWindow界面拖动时,使用ui界面拖动控件需去掉属性栏最下方"Docked"才能移动。
使用布局后不支持鼠标边框拖动,需用代码添加方式,复杂的要用到嵌套。
1.2 所遇异常问题(TopDockWidgetArea方式打开时高度固定占一半)
解决方法:采用LeftDockWidgetArea方式。
1.3 隐藏标题栏
QDockWidget::titleBarWidget默认为空指针,但标题栏默认存在,需新建空QWidget替换实现隐藏。
QWidget* lTitleBar = this->titleBarWidget();
QWidget* lEmptyWidget = new QWidget();
this->setTitleBarWidget(lEmptyWidget);
delete lTitleBar;
二.常用代码
2.1 构造函数中QDockWidget嵌套
//原则,先左右,再上下
addDockWidget(Qt::LeftDockWidgetArea, m_DockWidget_File);//Qt::TopDockWidgetArea,猜测Top格式打开时即占一半
splitDockWidget(m_DockWidget_File,m_DockWidget_Scan,Qt::Horizontal);
splitDockWidget(m_DockWidget_File,m_DockWidget_TDI,Qt::Vertical);//Item
tabifyDockWidget(m_DockWidget_TDI, m_DockWidget_Item);
tabifyDockWidget(m_DockWidget_Item,m_DockWidget_Frame);
2.2 恢复默认布局
//第一步 全部close
int nSize = m_vDock.size();
for (int i = 0; i < nSize; i++)
{
QDockWidget* dock = m_vDock.at(i);
dock->close();//hide()
//dock->lower();//raise();
}
//第二步 重新布局
addDockWidget(Qt::LeftDockWidgetArea, m_DockWidget_File);//Qt::TopDockWidgetArea,猜测Top格式打开时即占一半
splitDockWidget(m_DockWidget_File, m_DockWidget_Scan, Qt::Horizontal);
splitDockWidget(m_DockWidget_File, m_vDock.at(0), Qt::Vertical);//Item m_DockWidget_TDI
tabifyDockWidget(m_vDock.at(0), m_vDock.at(1));
tabifyDockWidget(m_vDock.at(1), m_vDock.at(2));
m_DockWidget_File->show();
m_DockWidget_Scan->show();
m_vDock.at(0)->show();
2.3 某自定义DockWIdget示例程序
CustomDockWidget::CustomDockWidget(QWidget *parent) : QDockWidget(parent)
{
}
bool CustomDockWidget::event(QEvent *event)
{
if (QEvent::ZOrderChange == event->type()) {
if (windowFlags() & Qt::WindowMaximizeButtonHint) {
return QDockWidget::event(event);
} else {
QWidget w;
setMaximumSize(w.maximumSize());
setWindowFlags(Qt::Dialog
| Qt::WindowCloseButtonHint
| Qt::WindowMaximizeButtonHint
| Qt::WindowMinimizeButtonHint);
show();
}
}
return QDockWidget::event(event);
}