整体布局
QMainWindow经常作为应用程序主窗体,其布局如下图
大致可以分为标题栏、菜单栏、工具栏、状态栏、dockwidgets(铆接部件)、centralwidget
标题栏
标题栏可以通过
setWindowTitle("test V1.0");
设置标题,同时可以进行版本显示。
菜单栏
菜单栏的框架如下
默认创建的QMainWindow存在一个默认的菜单栏menuBar(),可以通过如下代码获取
QMenuBar *MenuBar = menuBar();
或者删除默认菜单栏,自己新建一个MenuBar,通过setMenuBar()函数设置为主窗体的菜单栏,
//创建菜单栏
MenuBar = new QMenuBar(this);
setMenuBar(MenuBar);
随后则需要通过addMenu添加不同的菜单。
//第一个菜单 会话
QMenu *session = new QMenu(g_C2Q("会话(S)"),this);
MenuBar->addMenu(session);
此时,仅仅为菜单点击并无任何反应,需要在添加的菜单中添加二级菜单及不同的Action;
QMenu *newWidget = new QMenu(g_C2Q("新建会话(N)"),MenuBar);
//会话菜单下动作
QAction *newact = session->addMenu(newWidget);
QAction *act_tab =session->addAction(g_C2Q("新建标签页(T)"));
QAction *act = session->addAction(g_C2Q("报文"));
此时会话菜单中已经有二级菜单和2个QAction了,我们可以通过QAction的
QAction::triggered
信号连接槽函数,从而实现点击后的操作。
注意:可以看到addMenu()函数返回值为QAction *,所以可以对菜单栏下的菜单以及子菜单也绑定的槽函数,实现相应的功能
状态栏
和菜单栏一样,默认存在一个statusBar(),也可以删除后新建一个状态栏。
状态栏主要通过showMessage()函数显示相关信息。
//状态栏
statusBar = new QStatusBar(this);
statusBar->showMessage(QString("status Bar"),2000);
第一个参数是显示内容,第二个参数是显示持续时间。默认为0,表示一直显示。
此外,statusBar还可以通过addWidget()添加控件。
QPushButton *btn = new QPushButton("left");
statusBar->addWidget(btn,2);
QPushButton *btn1 = new QPushButton("right");
statusBar->addWidget(btn1,1);
setStatusBar(statusBar);
需要注意的是,如果设置了showMessage(),则控件不会显示。
工具栏
工具栏的框架结构与菜单栏类似,不过少了中间的menu,直接添加QAction,
此外,由于工具栏为区域,所以可以添加多个。并且可以沿着主窗体四周放置。
TBar_Edit->setAllowedAreas(Qt::LeftToolBarArea);
允许位置可以通过AllowedAreas属性设置。
DockWidgets
铆接部件,可以通过addDockWidget添加到主控界面上。
//铆接部件
dock = new QDockWidget(g_C2Q("报文"),this);
QTextEdit *edit = new QTextEdit(dock);
dock->setWidget(edit);
addDockWidget(Qt::BottomDockWidgetArea,dock);
实现 后可以将dockwidget放在主控界面内,也可以悬停与界面外,两者都可以有焦点
CentralWidget
关于CentralWidget没什么好说的,就是用来放置主空间的地方。
对于上述内容的还有一点共性:所有只能添加一个的(menuBar、StatusBar),都是使用set设置,而可以添加多个的(DockWidgets、ToolBars),则使用Add添加。
快捷方式
关于快捷方式,是通过QAction的函数
void setShortcut(const QKeySequence &shortcut)
其中QKeySequence可以是
- Qt::Key ,Qt::Key_T
- 字符串,tr("ctrl+S")
- 默认按键,QKeySequence::Open
但是需要注意的是:
第一,并不是所有的按键都是有效的,因为操作系统和环境不同,同样的按键可能不起作用,所以建议使用以上第三种默认的方式。
第二,对于menuBar来说,可以通过‘&’实现快捷键。
QAction *mact = new QAction("&set");
则在打开对应菜单后,按s即可触发。但是这个仅对英文且是menuBar而言,对于中文和toolBar则不起作用。
对于中文可以在其后用(&s)这样的方式来引入alt+s的快捷方式。
第三,对于默认快捷方式我们通常需要点击菜单,然后再点击快捷键,才能触发。但是其实这个属性是可以设置的,
act_open->setShortcutContext(Qt::ApplicationShortcut);
通过ShortcutContext属性可以将快捷键设置为四种不同的模式,其中Qt::ApplicationShortcut表示应用窗体活跃状态下都可以触发。