QMainwindow移植到QDialog
之前我用QMainwindow
来做项目中的图形显示模块,但QMainwindow
相当于另一个窗口,而整个应用要求只有一个程序,所以需要将QMainwindow
移植到QDialog
。
对于QT,QMainwindow
和QDialog
没有本质区别,都是窗口部件。只不过QMainwindow
提供预定义的布局来装载菜单栏、工具栏、状态栏等。可以看下QMainwindow
的源代码,内置布局管理器,但很复杂,我还没有仔细阅读。而QDialog
则没有提供默认布局,所以移植时需要手动编写菜单栏和工具栏。
我使用最简单的方法,使用三行QVBoxLayout
作为QDialog
的主布局管理器。第一行为菜单,第二行为工具栏,第三行为实际的窗口部件。主窗口部件集成自QWidget
,使得在QMainwindow
和QDialog
之间切换时,只需要修改菜单栏和工具栏,而不同修改其他部件。
void ImageViewerDialog::setupMainLayout()
{
main_vbox_layout_->setMargin(0);
main_vbox_layout_->addWidget(menu_bar_);
main_vbox_layout_->addWidget(tool_bar_);
main_vbox_layout_->addWidget(main_widget_, 1);
setLayout(main_vbox_layout_);
}
效果如下
——
注:尽管移植到QDialog
上,我还是觉得QMainwindow
更适合带菜单栏和工具栏的复杂窗体,使用封装好的效率更高。