Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法
QMenu和QMenuBar是Qt中的菜單類和菜單欄類,其中,菜單QMenu掛載在菜單欄QMenuBar上。本文主要總結(jié)QMenu的三種常用用法,分別為常規(guī)用法、繼承QWidgetAction自定義菜單項用法、將QMenu當(dāng)QWidget掛載一個布局用法。
下面對每種用法進(jìn)行原理講解和代碼總結(jié)。
一、常規(guī)用法
1.1原理講解
QMenuBar是菜單欄,QMenu是菜單,菜單QMenu是掛載在菜單欄QMenuBar上的,相當(dāng)于菜單欄QMenuBar是一個容器,菜單QMenu是容器中的其中一項,或者說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自定義菜單項用法
2.1原理講解
當(dāng)我們需要自定義菜單里面的每一項時,也就是需要自定義的菜單項內(nèi)容。菜單項就是菜單里面的子集,如下圖所示:
此時我們希望添加的action最好是一個QWidget,那樣就可以任意布局了。Qt提供了這樣的一個類QWidgetAction。該類繼承于QAction,因此對于任何掛載QAction希望自定義界面的需求,都可以用QWidgetAction替代QAction,進(jìn)行自定義界面定制。
調(diào)用QWidgetAction的方法有兩種,一個中直接當(dāng)成QAction用,只是在創(chuàng)建對象的時候,一定要關(guān)聯(lián)父控件為QMenu或者this;調(diào)用完后,設(shè)置函數(shù)void QWidgetAction::setDefaultWidget(QWidget *w);設(shè)置自定義的QWidget界面,然后用菜單像添加QAction一樣添加QWidgetAction對象即可。另一種方式是繼承QWidgetAction,在繼承子類構(gòu)造函數(shù)中設(shè)計要定義的QWidget布局,下面的代碼也是用繼承QWidgetAction的方法。
2.2代碼示例
分別添加兩個類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_H
qmywidgetaction.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); //如果寫成 QSplitter* sp = new QSplitter; 就無法顯示?。?! 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_H
qmymenu.cpp
#include "qmymenu.h" #include <QAction> QMyMenu::QMyMenu(const QString &title, QWidget *parent):QMenu(title,parent) //初始化子類構(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掛載一個布局用法
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用,添加一個布局"); 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ù)需求來定。但是,要是自定義菜單項的話,我傾向使用第三種,當(dāng)QMenu當(dāng)成一個QWidget來用最簡單省事,而且很容易做出各種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重寫虛函數(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(參考:主動隱藏菜單和主動顯示菜單)
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中?‘=default?’及‘?=delete?’的使用
這篇文章主要介紹了C++中?=default?及?=delete?使用,使用=default和=delete可以控制編譯器默認(rèn)函數(shù)體的使用,下面我們就來看看具體的室友方法吧,需要的朋友也可以參考一下2021-12-12Qt實現(xiàn)數(shù)據(jù)進(jìn)行加密、解密的步驟
本文主要介紹了Qt實現(xiàn)數(shù)據(jù)進(jìn)行加密、解密的步驟,包含QCryptographicHash和Qt-AES兩種庫的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-03-03