本文主要演示 Widget 中的 QMenuBar 控件的 二级菜单、三级菜单,信号槽的演示,添加图标、设置单选和多选、绑定快捷键,还有QToolBar、QStatusBar 的简单演示,适合初学者食用:
1、首先打开Qt Creator 创建一个 widget 项目
(然后在UI上顺便画一个按钮,添加一个动作,备用)
2、代码演示,篇幅原因,槽函数的声明在头文件中,这里就不放出来了,下面的是 widget.cpp内的代码
#include "widget.h"
#include "ui_widget.h"
#include <QMenuBar>
#include <QDebug>
#include <QToolBar>
#include <QStatusBar>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建菜单栏
QMenuBar *mb = new QMenuBar(this);
// 设置宽度为 widget 宽度
mb->resize(this->width(),mb->height());
// 创建菜单 一级菜单
m1 = mb->addMenu("文件"); // m1为私有成员变量,添加在了头文件中
QMenu *m2 = mb->addMenu("编辑");
QMenu *m3 = mb->addMenu("构建");
// 二级菜单
QMenu *e1 = m1->addMenu("新建文件"); // 创建Action以后就无法在Action下继续创建菜单了
QAction *e2 = m1->addAction("保存文件");
QAction *e3 = m1->addAction("关闭文件");
QAction *e4 = m1->addAction("退出");
m2->addAction(ui->actioncopy);
// 三级菜单
QAction *n1 = e1->addAction("新建.cpp");
QAction *n2 = e1->addAction("新建.ui");
// 写入图标
e1->setIcon(QIcon("C:/Users/patient/Pictures/Saved Pictures/小黄鸡IKUN篮球.jpg"));
e4->setIcon(QIcon("C:/Users/patient/Pictures/Saved Pictures/R-k.gif"));
QObject::connect(n1,SIGNAL(triggered()),this,SLOT(click()));
QObject::connect(e4,SIGNAL(hovered()),this,SLOT(hover()));
// 只有Menu类型才能有这个信号,所有子节点都能触发
QObject::connect(m1,SIGNAL(triggered(QAction*)),this,SLOT(click(QAction*)));
QObject::connect(mb,SIGNAL(hovered(QAction*)),this,SLOT(hover(QAction*)));
// 是否被选中
QObject::connect(e3,SIGNAL(triggered(bool)),this,SLOT(pitchOn(bool)));
// 菜单栏子节点单选、多选
e2->setCheckable(true); // 开启多选
e3->setCheckable(true);
e4->setCheckable(true);
// 编组,进行单选
QActionGroup *ag = new QActionGroup(this);
ag->addAction(e2);
// ag->addAction(e3);
ag->addAction(e4);
ag->setEnabled(true);
// 给按钮设置快捷键
ui->pushButton->setShortcut(QString("ctrl+a"));
e2->setShortcut(QString("ctrl+s"));
///工具栏
// 创建工具栏
QToolBar *tb = new QToolBar(this);
// 写入 X Y 宽 高
tb->setGeometry(0,mb->height(),this->width(),30);
// 写入图标大小
tb->setIconSize(QSize(30,30));
// 添加 Action
tb->addAction(e4);
/// 状态栏
// 创建状态栏
QStatusBar *sb = new QStatusBar(this);
// 写入 X Y 宽 高
sb->setGeometry(0,height()-30,this->width(),30);
// 提示消息,3秒后消失
sb->showMessage(QStringLiteral("欢迎使用状态栏"),3000);
}
Widget::~Widget()
{
delete ui;
}
// 槽函数
// 点击事件
void Widget::click()
{
qDebug() << "触发:新建文件";
}
void Widget::hover()
{
qDebug() << "鼠标悬浮";
}
void Widget::click(QAction * act)
{
qDebug() << act->text();
}
void Widget::hover(QAction * act)
{
if(act->text() == "构建")
{
qDebug() << "清理子节点,重新生成子节点";
act->menu()->clear();
act->menu()->addAction("构建所有项目");
act->menu()->addAction("执行qmake");
act->menu()->addAction("运行");
}
}
void Widget::pitchOn(bool change)
{
qDebug() << "选中状态变更为:" << change;
}
void Widget::buttonClick()
{
// 鼠标位置显示菜单
m1->exec(QCursor::pos());
}
3、主要演示了 QMenuBar 的信号:
QMenu 的信号: triggered(QAction*) 触发信号,传出一个 Action hovered(QAction*) 鼠标悬浮信号,传出一个 Action
QAction 的信号: hovered() 鼠标悬浮信号 triggered() 触发信号 triggered(bool) 触发信号
4、演示效果
( pro文件中加入一行 CONFIG += console 即可打开控制台)
5、注意事项:
UI 中间的按钮绑定了一个槽函数 buttonClick , 这个是通过设计师绑定的,所以代码中没有写,也可以自己在代码中用 QObject::connect 绑定也行
m1 是在头文件中的一个私有成员, QMenu *m1