QMainwindow移植到QDialog

之前我用QMainwindow来做项目中的图形显示模块,但QMainwindow相当于另一个窗口,而整个应用要求只有一个程序,所以需要将QMainwindow移植到QDialog

对于QT,QMainwindowQDialog没有本质区别,都是窗口部件。只不过QMainwindow提供预定义的布局来装载菜单栏、工具栏、状态栏等。可以看下QMainwindow的源代码,内置布局管理器,但很复杂,我还没有仔细阅读。而QDialog则没有提供默认布局,所以移植时需要手动编写菜单栏和工具栏。

我使用最简单的方法,使用三行QVBoxLayout作为QDialog的主布局管理器。第一行为菜单,第二行为工具栏,第三行为实际的窗口部件。主窗口部件集成自QWidget,使得在QMainwindowQDialog之间切换时,只需要修改菜单栏和工具栏,而不同修改其他部件。

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更适合带菜单栏和工具栏的复杂窗体,使用封装好的效率更高。