ToolBar工具栏在所有窗体应用程序中都广泛被使用,使用ToolBar可以很好的规范菜单功能分类,用户可根据菜单栏来选择不同的功能,Qt中默认自带ToolBar组件,当我们以默认方式创建窗体时,ToolBar就被加入到了窗体中,一般是以QToolBar的方式存在于对象菜单栏,如下所示。 QToolBar组件在开发中我遇到了以下这些功能,基本上可以应对大部分开发需求了,这里就做一个总结。 顶部工具栏ToolBar组件的定义有多种方式,我们可以直接通过代码生成,也可以使用图形界面UI拖拽实现,但使用代码时间则更加灵活一些,ToolBar组件可以表现出多种形态. 首先来看一个简单的生成案例,如下代码中我们通过属性setAllowedAreas()可以实现将ToolBar组件放置到上下左右四个不同的方位上面.
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("文件");
QAction *newAction = fileMenu->addAction("新建文件");
fileMenu->addSeparator();
QAction *openAction = fileMenu->addAction("打开文件");
QToolBar *toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);
toolBar->setAllowedAreas(Qt::TopToolBarArea |Qt::BottomToolBarArea);
toolBar->setAllowedAreas(Qt::LeftToolBarArea |Qt::RightToolBarArea);
toolBar->setFloatable(false);
toolBar->setMovable(false);
toolBar->addAction(newAction);
toolBar->addSeparator();
toolBar->addAction(openAction);
connect(newAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
});
connect(openAction,&QAction::triggered,this,[=](){
std::cout << "open action" << std::endl;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
折叠
 接着通过代码的方式实现一个顶部菜单栏,该菜单栏中可以通过SetIcon(QIcon("://image/1.ico"));指定图标,也可以使用setShortcut(Qt::CTRL | Qt::Key_C);为其指定特殊的快捷键。
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("文件");
QAction *newAction = fileMenu->addAction("新建文件");
newAction->setIcon(QIcon(":/image/1.ico"));
newAction->setShortcut(Qt::CTRL | Qt::Key_A);
fileMenu->addSeparator();
QAction *openAction = fileMenu->addAction("打开文件");
openAction->setIcon(QIcon(":/image/2.ico"));
openAction->setShortcut(Qt::CTRL | Qt::Key_C);
QToolBar *toolBar = new QToolBar(this);
addToolBar(Qt::BottomToolBarArea,toolBar);
toolBar->setFloatable(false);
toolBar->setMovable(false);
toolBar->addAction(newAction);
toolBar->addSeparator();
toolBar->addAction(openAction);
connect(newAction,&QAction::triggered,this,[=](){
std::cout << "new file slot" << std::endl;
});
connect(openAction,&QAction::triggered,this,[=](){
std::cout << "open file slot" << std::endl;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
折叠
 实现顶部菜单栏二级菜单,二级顶部菜单与一级菜单完全一致,只是在一级菜单的基础上进行了延申,如下代码则是定义了一个二级菜单。
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar *MainMenu = new QMenuBar(this);
this->setMenuBar(MainMenu);
QMenu *EditMenu = MainMenu->addMenu("编辑");
QAction *text = new QAction(EditMenu);
text->setText("编辑文件");
text->setShortcut(Qt::CTRL | Qt::Key_A);
text->setIcon(QIcon(":/image/1.ico"));
EditMenu->addAction(text);
EditMenu->addSeparator();
QAction *option = new QAction(EditMenu);
option->setText("配置模式");
option->setIcon(QIcon(":/image/2.ico"));
EditMenu->addAction(option);
QMenu *childMenu = new QMenu();
QAction *set_file = new QAction(childMenu);
set_file->setText("设置文件内容");
set_file->setIcon(QIcon(":/image/3.ico"));
childMenu->addAction(set_file);
QAction *read_file = new QAction(childMenu);
read_file->setText("读取文件内容");
read_file->setIcon(QIcon(":/image/2.ico"));
childMenu->addAction(read_file);
option->setMenu(childMenu);
EditMenu->addMenu(childMenu);
connect(text,&QAction::triggered,this,[=](){
std::cout << "edit file slot" << std::endl;
});
connect(set_file,&QAction::triggered,this,[=](){
std::cout << "set file slot" << std::endl;
});
connect(read_file,&QAction::triggered,this,[=](){
std::cout << "read file slot" << std::endl;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
折叠
 Qt中的菜单还可以实现任意位置的弹出,例如我们可以将右击 customContextMenuRequested()事件,绑定到主窗口中,实现在窗体任意位置右击都可以弹出菜单栏,代码如下。 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <iostream>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setContextMenuPolicy(Qt::CustomContextMenu);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &pos)
{
QMenu *pMenu = new QMenu(this);
QAction *pNewTask = new QAction(tr("新建"), this);
QAction *pEditTask = new QAction(tr("编辑"), this);
QAction *pDeleteTask = new QAction(tr("删除"), this);
pNewTask->setData(1);
pEditTask->setData(2);
pDeleteTask ->setData(3);
pMenu->addAction(pNewTask);
pMenu->addAction(pEditTask);
pMenu->addAction(pDeleteTask);
pNewTask->setIcon(QIcon(":/image/1.ico"));
pEditTask->setIcon(QIcon(":/image/2.ico"));
pDeleteTask->setIcon(QIcon(":/image/3.ico"));
connect(pNewTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pEditTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pDeleteTask, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));
pMenu->exec(QCursor::pos());
QList<QAction*> list = pMenu->actions();
foreach (QAction* pAction, list) delete pAction;
delete pMenu;
}
void MainWindow::onTaskBoxContextMenuEvent()
{
QAction *pEven = qobject_cast<QAction *>(this->sender());
int iType = pEven->data().toInt();
switch (iType)
{
case 1:
std::cout << "新建任务" << std::endl;
break;
case 2:
std::cout << "设置任务" << std::endl;
break;
case 3:
std::cout << "删除任务" << std::endl;
break;
default:
break;
}
}
折叠
 还可以将顶部的菜单通过bar->setVisible(false);属性将其隐藏起来,对外只展示出一个ToolBar控件栏位,ToolBar控件栏中只保留ICO图标与底部文字描述,这样能显得更加清爽一些。
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setContextMenuPolicy(Qt::NoContextMenu);
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("Ptr");
bar->setVisible(false);
QAction *NewAction = fileMenu->addAction("新建文件");
QAction *OpenAction = fileMenu->addAction("打开文件");
QAction *ReadAction = fileMenu->addAction("读入文件");
NewAction->setIcon(QIcon(":/image/1.ico"));
OpenAction->setIcon(QIcon(":/image/2.ico"));
ReadAction->setIcon(QIcon(":/image/3.ico"));
QToolBar *toolBar = new QToolBar(this);
addToolBar(Qt::TopToolBarArea,toolBar);
toolBar->addAction(NewAction);
toolBar->addAction(OpenAction);
toolBar->addAction(ReadAction);
toolBar->setFloatable(false);
toolBar->setMovable(false);
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
connect(NewAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
});
connect(OpenAction,&QAction::triggered,this,[=](){
std::cout << "open action" << std::endl;
});
connect(ReadAction,&QAction::triggered,this,[=](){
std::cout << "read action" << std::endl;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
折叠
 文章出处: https://www.cnblogs.com/LyShark/p/15593781.html |