Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法
QMenu和QMenuBar是Qt中的菜單類(lèi)和菜單欄類(lèi),其中,菜單QMenu掛載在菜單欄QMenuBar上。本文主要總結(jié)QMenu的三種常用用法,分別為常規(guī)用法、繼承QWidgetAction自定義菜單項(xiàng)用法、將QMenu當(dāng)QWidget掛載一個(gè)布局用法。
下面對(duì)每種用法進(jìn)行原理講解和代碼總結(jié)。
一、常規(guī)用法
1.1原理講解
QMenuBar是菜單欄,QMenu是菜單,菜單QMenu是掛載在菜單欄QMenuBar上的,相當(dāng)于菜單欄QMenuBar是一個(gè)容器,菜單QMenu是容器中的其中一項(xiàng),或者說(shuō)QMenuBar內(nèi)的子集全部是菜單QMenu,如下圖所示:

1.2添加常規(guī)菜單欄和菜單用法代碼
#include <QMenu>
#include <QAction>
#include <QMenuBar>
#include <QVBoxLayout>
void Widget::on_pushButton_clicked()
{
QMenu *menu=new QMenu("菜單:常規(guī)");
QAction *action1=new QAction(QIcon(":/resource/image/向右箭頭.jpg"),"action1");
QAction *action2=new QAction(QIcon(":/resource/image/向右箭頭.jpg"),"action2");
QList<QAction*> list;
list.append(action1);
list.append(action2);
menu->addActions(list);
QMenuBar *menuBar=new QMenuBar;
menuBar->addMenu(menu);
menuBar->addSeparator(); //分隔欄
ui->verticalLayout->addWidget(menuBar);
}
二、繼承QWidgetAction自定義菜單項(xiàng)用法
2.1原理講解
當(dāng)我們需要自定義菜單里面的每一項(xiàng)時(shí),也就是需要自定義的菜單項(xiàng)內(nèi)容。菜單項(xiàng)就是菜單里面的子集,如下圖所示:

此時(shí)我們希望添加的action最好是一個(gè)QWidget,那樣就可以任意布局了。Qt提供了這樣的一個(gè)類(lèi)QWidgetAction。該類(lèi)繼承于QAction,因此對(duì)于任何掛載QAction希望自定義界面的需求,都可以用QWidgetAction替代QAction,進(jìn)行自定義界面定制。
調(diào)用QWidgetAction的方法有兩種,一個(gè)中直接當(dāng)成QAction用,只是在創(chuàng)建對(duì)象的時(shí)候,一定要關(guān)聯(lián)父控件為QMenu或者this;調(diào)用完后,設(shè)置函數(shù)void QWidgetAction::setDefaultWidget(QWidget *w);設(shè)置自定義的QWidget界面,然后用菜單像添加QAction一樣添加QWidgetAction對(duì)象即可。另一種方式是繼承QWidgetAction,在繼承子類(lèi)構(gòu)造函數(shù)中設(shè)計(jì)要定義的QWidget布局,下面的代碼也是用繼承QWidgetAction的方法。
2.2代碼示例
分別添加兩個(gè)類(lèi)QMyMenu和QMyWidgetAction,其中QMyMenu繼承QMenu,QMyWidgetAction繼承QWidgetAction。
qmywidgetaction.h
#ifndef QMYWIDGETACTION_H
#define QMYWIDGETACTION_H
#include <QWidgetAction>
class QMyWidgetAction : public QWidgetAction
{
public:
explicit QMyWidgetAction(QWidget *parent=0);
protected:
virtual QWidget *createWidget(QWidget *parent);
};
#endif // QMYWIDGETACTION_Hqmywidgetaction.cpp
#include "qmywidgetaction.h"
#include <QPushButton>
#include <QSplitter>
#include <QLabel>
#include <QLineEdit>
#include <QPixmap>
#include <QMouseEvent>
#include <QHBoxLayout>
#include <QDebug>
QMyWidgetAction::QMyWidgetAction(QWidget *parent):QWidgetAction(parent)
{
}
QWidget *QMyWidgetAction::createWidget(QWidget *parent)
{
QLabel* lab = new QLabel("label1");
QPushButton *button1=new QPushButton("button1");
QHBoxLayout *hlayout=new QHBoxLayout;
hlayout->setMargin(0);
hlayout->setSpacing(0);
hlayout->addWidget(lab);
hlayout->addWidget(button1);
QWidget* widget = new QWidget(parent); //如果寫(xiě)成 QSplitter* sp = new QSplitter; 就無(wú)法顯示?。?!
widget->setLayout(hlayout);
connect(button1,&QPushButton::clicked,[this](bool){qDebug()<<"單擊按鈕!";});
return widget;
}qmymenu.h
#ifndef QMYMENU_H
#define QMYMENU_H
#include <QMenu>
#include <QMouseEvent>
class QMyMenu : public QMenu
{
public:
explicit QMyMenu(const QString &title, QWidget *parent = Q_NULLPTR);
protected:
};
#endif // QMYMENU_Hqmymenu.cpp
#include "qmymenu.h"
#include <QAction>
QMyMenu::QMyMenu(const QString &title, QWidget *parent):QMenu(title,parent) //初始化子類(lèi)構(gòu)造函數(shù)
{
}在按鈕槽函數(shù)調(diào)用如下代碼即可
#include "qmywidgetaction.h"
#include "qmymenu.h"
#include <QAction>
#include <QMenuBar>
#include <QVBoxLayout>
void Widget::on_pushButton_3_clicked()
{
QMyMenu *menu= new QMyMenu("菜單:繼承QWidgetAction用法");
QAction *action1=new QAction(QIcon(":/resource/image/向右箭頭.jpg"),"1"); //設(shè)置圖標(biāo)和內(nèi)容
menu->addAction(action1);
QMyWidgetAction *myWidgetAction=new QMyWidgetAction(menu);
menu->addSeparator(); //添加分割線
menu->addAction(myWidgetAction);
QMenuBar *menuBar=new QMenuBar(this);
menuBar->setStyleSheet("QMenuBar{background-color:red}"
"QMenuBar:hover{background-color:blue}");
menuBar->addMenu(menu);
ui->verticalLayout->addWidget(menuBar);
ui->verticalLayout->addStretch();
}結(jié)果如下圖所示

三、將QMenu當(dāng)QWidget掛載一個(gè)布局用法
3.1原理詳解
QMenu是繼承QWidget的,故我們可以當(dāng)成QWidget一樣進(jìn)行布局調(diào)用,在布局上添加我們自定義的界面。
class Q_WIDGETS_EXPORT QMenu : public QWidget
{}3.2示例代碼
void Widget::on_pushButton_2_clicked()
{
QMenu *menu=new QMenu("菜單:當(dāng)Widget用,添加一個(gè)布局");
QAction *action1=new QAction(QIcon(":/resource/image/向右箭頭.jpg"),"action1");
QAction *action2=new QAction(QIcon(":/resource/image/向右箭頭.jpg"),"action2");
QList<QAction*> list;
list.append(action1);
list.append(action2);
QVBoxLayout *vlayout=new QVBoxLayout;
vlayout->setContentsMargins(10,0,10,0);
QPushButton *button1=new QPushButton("11");
vlayout->addWidget(button1);
menu->setLayout(vlayout);
QMenuBar *menuBar=new QMenuBar;
menuBar->addMenu(menu);
menuBar->addSeparator();
ui->verticalLayout->addWidget(menuBar);
}結(jié)果如下圖所示:

總結(jié):具體的需要哪種用法,業(yè)務(wù)需求來(lái)定。但是,要是自定義菜單項(xiàng)的話,我傾向使用第三種,當(dāng)QMenu當(dāng)成一個(gè)QWidget來(lái)用最簡(jiǎn)單省事,而且很容易做出各種QSS樣式表效果。
參考內(nèi)容:
https://blog.csdn.net/naibozhuan3744/article/details/80855818(參考:QMenu用法)
https://blog.csdn.net/lengyuezuixue/article/details/81123516(參考:QWidgetAction直接用法)
https://blog.csdn.net/lengyuezuixue/article/details/81123516(參考:QWidgetAction繼承用法)
https://blog.csdn.net/HYNzhl/article/details/77542421(參考:QWidgetAction重寫(xiě)虛函數(shù)createWidget)
https://blog.csdn.net/ly305750665/article/details/53558935(參考:自定義QMenu)
https://www.cnblogs.com/newstart/p/4478689.html(參考:設(shè)置QMenuBar屬性)
https://bbs.csdn.net/topics/390276550(參考:主動(dòng)隱藏菜單和主動(dòng)顯示菜單)
https://www.cnblogs.com/swarmbees/p/5634650.html(參考:QWidgetAction用法)
https://blog.csdn.net/peppereggfriedrice/article/details/78861115(參考:QMenu樣式表QSS)
https://bbs.csdn.net/topics/391821575(參考:QMenu樣式表QSS)
https://www.bbsmax.com/A/kvJ3OWeXJg/(參考:Qt所有樣式表,翻譯版)
到此這篇關(guān)于Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法的文章就介紹到這了,更多相關(guān)Qt菜單QMenu和菜單欄QMenuBar內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析C語(yǔ)言中結(jié)構(gòu)體struct的對(duì)齊問(wèn)題
這篇文章主要介紹了C語(yǔ)言中結(jié)構(gòu)體struct的對(duì)齊問(wèn)題,作者深入到內(nèi)存分配方面來(lái)進(jìn)行解析,需要的朋友可以參考下2016-04-04
簡(jiǎn)單實(shí)現(xiàn)C++復(fù)數(shù)計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C++簡(jiǎn)單實(shí)現(xiàn)復(fù)數(shù)計(jì)算器的的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)
以下是對(duì)C/C++中static關(guān)鍵字的作用進(jìn)行了總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
C++遍歷磁盤(pán)驅(qū)動(dòng)器的示例代碼
這篇文章主要介紹了C++遍歷磁盤(pán)驅(qū)動(dòng)器的示例代碼,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下2021-01-01
基于QT和百度云api實(shí)現(xiàn)批量獲取PDF局部文字內(nèi)容
這篇文章將為大家介紹如何使用 QT 構(gòu)建圖形用戶(hù)界面,結(jié)合百度云 OCR API 實(shí)現(xiàn)批量獲取 PDF 局部文字內(nèi)容并對(duì)文件進(jìn)行改名的功能,需要的可以參考下2025-03-03
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C語(yǔ)言實(shí)現(xiàn)第一次防死版掃雷游戲
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)第一次防死版掃雷游戲,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01

