简述
普通的桌面应用程序有个共同的特性,有菜单栏、工具栏、状态栏、中央窗口等部件。菜单栏其实可以看成是一个窗口,菜单栏中的每一个菜单也可以看成一个窗口,每个部件基本都可以认为是一个窗口。那么这些典型的桌面应用可以认为是一些QWidget的组合,通过QWidget派生的方式也确实能够完成这样的窗口。
但是如果每次都自己去设计,重复这些工作,想想都有些麻烦,于是Qt帮我们实现这样的窗口,叫做QMainWindow,QMainWindow已经布置好菜单栏、工具栏、状态栏等窗口,我们只需要懂得如何去应用就行了。
QMainWindow的布局
QMainWindow类创建一个主应用程序的窗口,类似于MFC中中的单文档/多文档,其基本布局如下:
注:MenuBar是菜单栏,toolbars是工具栏,Dock Widgets是停口窗口,Central Widget是中央窗口,Status Bar是状态栏。中央窗口是必须的,即使它只是一个占位符也必须存在。
创建一个QMainWindow工程
初始化的QMainWindow窗口就具有以下控件:QMenuBar-菜单栏、QToolBar-工具栏、QStatusBar-状态栏
中央窗口
一个中央窗口是一个典型的QT部件,例如QTextEdit或者QGraphicsView,可以自定义部件用于高级应用。可以使用setCentralWidget()函数来设置中央窗口。
主窗口可以是一个单文档或者多文档界面,可以使用QMdiArea作为中心部件。
QMainWindow的中央窗口可以使用QMainWindow::CentralWidget来设置一个QWidget对象或者派生类对象作为主窗口的中央窗口。
QTextEdit * edit = new QTextEdit(this);
this->setCentralWidget(edit);
菜单
在Qt中菜单栏类是QMenuBar,它也是继承至QWidget,菜单栏是一个长条状窗口,可以是横向也可以是纵向的,菜单栏上可以布置菜单。这个大家好像都知道~
可以在QT Designer中添加,菜单栏的Action被点击时会发出triggered()信号,然后在代码中将之和槽函数连接起来,便实现了一个一个功能。
采用Qt Designer设计UI界面时,在编辑菜单时,输入菜单名称前面需要加"&",例如在菜单栏添加菜单"File"时,需要双击"在此处输入"的地方输入"&File",并且按下"Enter"键,这样才能保证File创建成功。
新建好后,在下面建立子菜单"New"
在"Action Editor"中右键,选择"转到槽"…
选择"triggered()"信号,点击[OK]…
通过QMainWindow::MenuBar() 来获取一个QMenuBar对象的指针, 如果该对象不存在, 就新建一个对象。
可以通过new一个QMenuBar对象,然后通过QMainWindow::setMenuBar来设置主窗口的菜单栏。
创建完菜单栏之后,就可以在菜单栏上面布置菜单了,菜单类叫作QMenu,QMenu也是继承至QWidget。
菜单中的诸如打开、保存、关闭等,都是一个个动作,在Qt里面对应的类是QAction,它不是窗口类,它是继承至QObject。可以使用QMenu::addAction来添加动作,QMenu::addAction有多个重载的函数,都是返回一个新建的QAction对象。
分隔符可以起到修饰的作用,使用QMenu::addSeparator()添加分割符号。
工具栏
工具栏类是QToolbar,QToolbar对象中可以布置一些QAction动作,QToolbar继承至QWidget,主窗口可以使用QMainWindow::addToolBar来添加工具栏。
采用Qt Designer设计UI界面时,在编辑工具栏时,现在"Action Editor"中新建Action,然后将新建好的Action拖动到Toolbar上面去即可。
状态栏
Qt中的状态栏类是QStatusBar,也是继承至QWidget,状态栏用来显示程序的运行状态,比如"就绪、编辑中"。
QStatusBar::showMessage函数可以用来设置状态栏的显示信息
ui->statusBar->setSizeGripEnabled(false);
ui->statusBar->showMessage(tr("临时信息!"), 2000);
停靠窗口
Qt中停靠窗口类为QDockWidget,QDockWidget继承至QWidget,这种窗口可以停靠在主窗口的停靠区域。
QDockWidget*dock= new QDockWidget("dock", this);
QTextEdit*edit= new QTextEdit("dock", dock);
dock->setWidget(edit);
this->addDockWidget(Qt::LeftDockWidgetArea, dock);