简介
欲实现以下功能:
用dockWidget将“大纲”、“参数”、“视窗”等子窗口显示出来
点击“大纲”中的选项(例如“物理模型”),右侧“参数”会显示对应的控件
若控件太多,显示垂直滚动条
如图所示。

下面对遇到的问题进行总结。
常见问题
ScrollArea没有铺满DockWidget
使用setWidget(),例如
dock_TaskPage->setWidget(ui->scrollArea);
类似地,在“视窗”中添加graphicsView
dock_Display->setWidget(ui->graphicsView);
但是,参数为ui->stacked(QStackedWidget)时会闪退,显示“程序异常退出”
dock_TaskPage->setWidget(ui->stacked);
可能是因为该QStackedWidget还没有添加page或者没初始化。
ScrollArea没有显示滚动条
试出来一种方法,仅为权宜之计。
步骤
在UI编辑器中,往scrollAreaWidgetContents中拖入一个Layout,往Layout中拖入你想要显示的Widget(例如QStackedWidget stacked,以下简称stacked)
setLayout
ui->scrollAreaWidgetContents->setLayout(ui->verticalLayout);
在UI编辑器中设置stacked的SizePolicy的垂直策略为Maximum


scrollAreaWidgetContents的垂直策略也设置为Maximum

将stacked中的page的垂直策略设置为fixed,并且使得MaximumSize和MinimumSize的高度相等

在代码中,将page的minimumHeight传给stacked和scrollAreaWidgetContents的maximumHeight
QStackedWidget* w=ui->stacked;
int ih=w->currentWidget()->minimumHeight();
w->setMaximumHeight(ih);
ui->scrollAreaWidgetContents->setMaximumHeight(ih);
代码
初始化:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
FileEdit::pFileEdit=&file1;
initMainWindow();
initDocks();
initOutlineView();
initTaskPage();
}
...
void MainWindow::initTaskPage(){
//
page_c=new Page_ComputeInit;
page_g=new Page_GeoGrid;
page_m=new Page_MoveObj;
page_o=new Page_Output;
page_p=new Page_PhysicModel;
page_s=new Page_Spatial;
page_t=new Page_Time;
QStackedWidget* w=ui->stacked;
w->addWidget(page_c);
w->addWidget(page_g);
w->addWidget(page_m);
w->addWidget(page_o);
w->addWidget(page_p);
w->addWidget(page_s);
w->addWidget(page_t);
w->setCurrentIndex(2);//page_c
//滚动条
int ih=w->currentWidget()->minimumHeight();
w->setMaximumHeight(ih);
ui->scrollAreaWidgetContents->setMaximumHeight(ih);
ui->scrollAreaWidgetContents->setLayout(ui->verticalLayout);
dock_TaskPage->setWidget(ui->scrollArea);
ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//初始化数据
...
}
当点击“大纲”中的选项时:
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
...
//滚动条
QStackedWidget* w=ui->stacked;
int ih=w->currentWidget()->minimumHeight();
w->setMaximumHeight(ih);
ui->scrollAreaWidgetContents->setMaximumHeight(ih);
...
}