Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow。MainWindow继承自QMainWindow。QMainWindow窗口分成几个主要的区域:
最上面是Window Title,用于显示标题和控制按钮,比如最大化、最小化和关闭等;下面一些是Menu Bar,用于显示菜单;再下面一点事Toolbar areas,用于显示工具条,注意,Qt的主窗口支持多个工具条显示,因此这里是ares,你可以把几个工具条并排显示在这里,就像Word2003一样;工具条下面是Dock window areas,这是停靠窗口的显示区域,所谓停靠窗口就是像Photoshop的工具箱一样,可以在主窗口的四周显示;再向下是Status Bar,就是状态栏;中间最大的Central widget就是主要的工作区了。
mainwindow的ui文件是默认有menubar,maintoolbar和statusbar的。
- QMenuBar:窗口的菜单栏,在此基础上添加不同的QMenu和QAction
- QMenu:菜单,可以显示文本和图标,但是并不负责执行操作
- QAction: 负责执行操作的部件
- QStatusBar:负责提示的状态栏,通常在窗口最下侧
一、通过设计器添加菜单栏和状态栏
参考大神博客:Qt添加菜单栏和工具栏
二、自定义菜单栏
//插入菜单栏
QMenuBar* menuBar = new QMenuBar(this);
menuBar->resize(width(), menuBar->height());
//一级菜单
QMenu* menu1 = menuBar->addMenu(QStringLiteral("菜单1"));
//绑定信号槽
//包含QMenu所有的子菜单都会触发
connect(menu1, &QMenu::triggered, [=](const QAction *action) {
qDebug() << QStringLiteral("一级菜单被按下:") << action->text() << endl;
});
//二级菜单
QAction* action1 = menu1->addAction(QStringLiteral("二级菜单1.1"));
//绑定信号槽
connect(action1, &QAction::triggered, [=]() {
qDebug() << QStringLiteral("二级菜单1.1被按下") << endl;
});
QAction* action2 = menu1->addAction(QStringLiteral("二级菜单1.2"));
//绑定信号槽
connect(action1, &QAction::hovered, [=]() {
qDebug() << QStringLiteral("二级菜单1.2鼠标移上去") << endl;
});
QAction* action3 = menu1->addAction(QStringLiteral("二级菜单1.3"));
//设置图标
action3->setIcon(QIcon("1.jpg"));
//三级菜单
QMenu* m = menu1->addMenu(QStringLiteral("二级菜单1.4"));
m->setIcon(QIcon("1.jpg"));
QAction* action4 = m->addAction(QStringLiteral("三级菜单1.4.1"));
QMenu* menu2 = menuBar->addMenu(QStringLiteral("菜单2"));
QMenu* menu3 = menuBar->addMenu(QStringLiteral("菜单3"));
三、鼠标悬停产生动态QMenu
//插入菜单栏
QMenuBar* menuBar = new QMenuBar(this);
menuBar->resize(width(), menuBar->height());
//一级菜单
QMenu* menu1 = menuBar->addMenu(QStringLiteral("菜单1"));
//鼠标悬停动态产生QMenu菜单
connect(menuBar, &QMenuBar::hovered, [=](const QAction *action) {
if (action->text() == QStringLiteral("菜单3"))
{
//动态菜单
action->menu()->clear();
action->menu()->addAction(QStringLiteral("菜单3.1"));
action->menu()->addAction(QStringLiteral("菜单3.2"));
action->menu()->addAction(QStringLiteral("菜单3.3"));
}
});
QMenu* menu2 = menuBar->addMenu(QStringLiteral("菜单2"));
QMenu* menu3 = menuBar->addMenu(QStringLiteral("菜单3"));
四、QMenu菜单的单选和多选
- void setCheckable(bool); 设置多选
- void setChecked(bool); 设置是否选中
- void setExclusive(bool); 设置单选
//二级菜单
QAction* action1 = menu1->addAction(QStringLiteral("二级菜单1.1"));
QAction* action2 = menu1->addAction(QStringLiteral("二级菜单1.2"));
QAction* action3 = menu1->addAction(QStringLiteral("二级菜单1.3"));
//设置多选
action1->setCheckable(true);
action2->setCheckable(true);
action3->setCheckable(true);
//设置选中
action3->setChecked(true);
QActionGroup *group = new QActionGroup(this);
group->addAction(action1);
group->addAction(action2);
group->addAction(action3);
//设置多选
group->setExclusive(true);
五、QMenu按钮菜单(右键菜单)
//插入菜单栏
QMenuBar* menuBar = new QMenuBar(this);
menuBar->resize(width(), menuBar->height());
//一级菜单
menu1 = menuBar->addMenu(QStringLiteral("菜单1"));
connect(ui.pushButton, &QPushButton::clicked, [=]() {
menu1->exec(QCursor::pos()); //鼠标点击位置处添加菜单
});
1. 可以直接通过设计器里面(动作)添加QAction,然后再代码里面将此Action()添加到菜单项,同时可以设置快捷方式
六、QToolBar工具栏和QStatusBar状态栏
1. QToolBar工具栏
//工具栏,菜单项的快捷方式
QToolBar *toolBar = addToolBar("toolBar");
//设置图标尺寸
toolBar->setIconSize(QSize(30, 30));
//工具栏添加快捷键
toolBar->addAction(pNew);
QPushButton *b = new QPushButton(this);
b->setText("^_^");
//添加小控件
toolBar->addWidget(b);
2. QStatusBar状态栏
//状态栏
QStatusBar *sBar = statusBar();
QLabel *label = new QLabel(this);
label->setText("Normal text file");
sBar->addWidget(label);
//addWidget 从左往右添加
sBar->addWidget(new QLabel("2", this));
// addPermanentWidget 从右往左添加
sBar->addPermanentWidget(new QLabel("3", this));
//实现消息定时消失
sBar->showMessage(QStringLiteral("测试消息三秒消失"),3000);
七、QMainWindow菜单工具状态栏
- QMenuBar *menuBar() const; 可以直接获取菜单栏
- QStatusBar *statusBar() const; 可以直接获取状态栏
this->menuBar()->addAction(QStringLiteral("测试"));
this->statusBar()->showMessage(QStringLiteral("这是一个状态栏"), 5000);
ui.mainToolBar->addAction(QStringLiteral("按钮一"));
ui.mainToolBar->addAction(QIcon("1.jpg"), QStringLiteral("按钮二"));
//文本显示在图标下面
ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
//工具栏换行
this->addToolBarBreak();
//默认顶部插入
QToolBar *b = this->addToolBar("Tool2");
b->addAction(QStringLiteral("按钮2"));
//左侧插入
QToolBar *t = new QToolBar(QStringLiteral("按钮2"));
t->addAction(QStringLiteral("左侧"));
this->addToolBar(Qt::LeftToolBarArea, t); //Qt::LeftToolBarArea左侧, 可以在顶部,底部,右侧