目录
一.菜单栏(MenuBar)
二.工具栏(ToolBar)
三.状态栏(StatusBar)
四.浮动窗口(DockWidget)
五.右键菜单
六.托盘菜单
一.菜单栏(MenuBar)
菜单栏有两种方式可以创建,一种获取系统提供的,一种是自己new一个,然后窗口setMenuBar为新建菜单:
//获取提供的MenuBar
QMenuBar* bar = menuBar();
//自己new一个
QMenuBar* selfBar = new QMenuBar(this);
this->setMenuBar(selfBar);
菜单栏的操作一般是:添加菜单(Menu),添加菜单行为(Action),给菜单添加快捷键,连接信号与槽:
void MainWindow::initMenuBar()
{
//获取提供的MenuBar
QMenuBar* bar = menuBar();
//自己new一个
QMenuBar* selfBar = new QMenuBar(this);
this->setMenuBar(selfBar);
//给菜单栏添加菜单项,可以添加图标
//给菜单添加快捷键,在写菜单文本时用&表示
QMenu* fileMenu = selfBar->addMenu("文件(&F)");
QMenu* editMenu = selfBar->addMenu("编辑(&D)");
//给菜单添加动作,三种方式
auto newfileAct = fileMenu->addAction("新建文件");
auto openfileAct = fileMenu->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_FileIcon),"打开文件");
auto saveAct = new QAction(style()->standardIcon(QStyle::StandardPixmap::SP_DirIcon),"保存文件");
fileMenu->addAction(saveAct);
//连接信号
//1.复杂写法,每个写一遍,需要先接收一下返回值,直接连接动作信号
connect(newfileAct,&QAction::triggered,this,[](){
qDebug()<<"newfileAct";
});
connect(openfileAct,&QAction::triggered,this,[](){
qDebug()<<"openfileAct";
});
connect(saveAct,&QAction::triggered,this,[](){
qDebug()<<"saveAct";
});
//2.通过menu的信号处理动作的信号,可以捕获动作
connect(fileMenu,&QMenu::triggered,this,[=](QAction* act){
if(act == newfileAct)
{
}else if(act == openfileAct)
{
}else if(act == saveAct)
{
}
qDebug()<<"triggered"<<act->text();
});
//3.直接在添加动作的时候添加处理函数,跟connect差不多
fileMenu->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_MessageBoxWarning),"消息警告"
,this,[](){qDebug()<<"消息警告";});
//给动作添加快捷键,中间不能加空格
newfileAct->setShortcut(QKeySequence("Ctrl+N"));
openfileAct->setShortcut(QKeySequence("Ctrl+O"));
//设置动作可以选中
newfileAct->setCheckable(true);
}
二.工具栏(ToolBar)
- 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠
工具栏一般是那种有图标的或者按钮:
void MainWindow::toolBar()
{
//添加工具栏
QToolBar* toolBar = addToolBar("toolBar");
//添加动作
toolBar->addAction(QIcon(":/new/prefix1/phone.ico"),"电话");
toolBar->addAction("hello");
toolBar->addWidget(new QPushButton("按钮"));
//可以有多个工具栏
QToolBar* toolBar1 = addToolBar("toolBar");
//添加动作
toolBar1->addAction(QIcon(":/new/prefix1/phone.ico"),"电话");
toolBar1->addAction("hello");
toolBar1->addWidget(new QPushButton("按钮"));
}
三.状态栏(StatusBar)
同样的,有两种创建方式,一种是获取自带的状态栏,一种是new一个然后设置。
QStatusBar* statusbar = statusBar();
QStatusBar* statusbar = new QStatusBar;
this->setStatusBar(statusbar);
一般状态栏搭配Lable使用,文字放左边,按钮放右边,添加默认是左对齐,可以换。
void MainWindow::statusBar()
{
//一般来说,showmessage左边,能点的放右边
//获取自带的状态栏
QStatusBar* bar = QMainWindow::statusBar();
//添加控件,默认左对齐
bar->addWidget(new QLabel("状态"));
bar->addWidget(new QPushButton("AN状态"));
//添加在右边的控件
bar->addPermanentWidget(new QLabel("right"));
auto show = new QPushButton("showMessage",this);
bar->addPermanentWidget(show);
connect(show,&QPushButton::clicked,this,[=](){
//显示状态信息,参数2表示显示时长
bar->showMessage("我在哦",2000);
});
}
四.浮动窗口(DockWidget)
- 也叫停靠窗口,可以有多个, 默认没有提供, 窗口的上下左右都可以停靠
void MainWindow::dockWidget()
{
//创建浮动窗口
QDockWidget* gitDock = new QDockWidget("Git");
QDockWidget* solveDock = new QDockWidget("解决方案管理器");
QDockWidget* teamDock = new QDockWidget("团队资源管理器");
QDockWidget* resDock = new QDockWidget("资源视图");
auto btn = new QPushButton("btn",gitDock);
//把浮动窗口添加到mainwindow
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,gitDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,solveDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,teamDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,resDock);
//分割浮动窗口
splitDockWidget(gitDock,solveDock,Qt::Orientation::Horizontal);
//选项卡式停靠
tabifyDockWidget(teamDock,resDock);
}
五.右键菜单
- 在桌面右击鼠标会出现菜单,这个我们一般叫做右键菜单
- 首先需要给控件设置上下文菜单策略 setContextMenuPolicy(Qt::CustomContextMenu)
- 设置该策略后当我们右键点击控件时qt会发送一个信号 customContextMenuRequested(const QPoint &pos) ,其中参数pos用来传递右键点击时的鼠标的坐标,这个坐标一般是相对于控件左上角而言的
- 最后给这个信号设置相应的槽函数,在槽函数中将菜单展示出来就行了。
//添加一个中心窗口
this->setCentralWidget(new QTextEdit);
//设置右键菜单策略
setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
contextMenu = new QMenu(this);
contextMenu->addAction("a");
contextMenu->addAction("b");
//添加分割线
contextMenu->addSeparator();
contextMenu->addAction("c");
contextMenu->addAction("d");
//连接信号与槽
connect(this,&MainWindow::customContextMenuRequested,this,[=](const QPoint& pos){
//pos是相对屏幕的坐标
// contextMenu->popup(pos);//弹出
//需要相对坐标转为相对窗口的坐标
//1.使用mapToParent
contextMenu->popup(mapToParent(pos));
//2.直接用全局
contextMenu->popup(QCursor::pos());
qDebug()<<"连接成功";
});
六.托盘菜单
- 系统托盘就是在系统桌面底部特定的区域显示运行的程序
void MainWindow::inittrayIcon()
{
//创建,托盘一定要设置图标
trayIcon = new QSystemTrayIcon(QIcon(":/new/prefix1/phone.ico"),this);
//必须要手动显示
trayIcon->show();
//给托盘添加菜单
QMenu* menu = new QMenu("我是一个菜单",this);
menu->addAction("打开主面板",this,&MainWindow::showNormal);
menu->addSeparator();
// menu->addAction("退出程序",this,&MainWindow::close);//这种方式只适用于单窗口退出
menu->addAction("退出程序",qApp,&QApplication::quit);//真正退出
//把菜单交给托盘
trayIcon->setContextMenu(menu);
//处理托盘的信号
connect(trayIcon,&QSystemTrayIcon::activated,this,&MainWindow::onActive);
}
void MainWindow::onActive(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::ActivationReason::Unknown:
qDebug()<<"Unknown";
break;
case QSystemTrayIcon::ActivationReason::DoubleClick:
qDebug()<<"DoubleClick";
break;
case QSystemTrayIcon::ActivationReason::Context:
qDebug()<<"Context";
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)