欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法

 更新時間:2022年05月12日 11:19:54   作者:三公子Tjq  
本文主要介紹了Qt菜單QMenu和菜單欄QMenuBar及自定義菜單用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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語言文件讀寫示例(c語言文件操作)

    c語言文件讀寫示例(c語言文件操作)

    這篇文章主要介紹了c語言文件讀寫示例(c語言文件操作),需要的朋友可以參考下
    2014-02-02
  • C語言二叉樹的遍歷示例介紹

    C語言二叉樹的遍歷示例介紹

    大家好,本篇文章主要講的是C語言二叉樹的遍歷示例介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Qt定時器類QTimer使用詳解與注意事項

    Qt定時器類QTimer使用詳解與注意事項

    Qt提供了兩種定時器,一種是QObject類的定時器,另一種是QTimer類的定時器,這篇文章主要給大家介紹了關(guān)于Qt定時器類QTimer使用與注意事項的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 一些語言的按行讀取文件的代碼實現(xiàn)小結(jié)

    一些語言的按行讀取文件的代碼實現(xiàn)小結(jié)

    這篇文章主要介紹了一些語言的按行讀取文件的代碼實現(xiàn)小結(jié),這里羅列了Java和C語言和C++以及PHP的實現(xiàn)需要的朋友可以參考下
    2015-08-08
  • C++中?‘=default?’及‘?=delete?’的使用

    C++中?‘=default?’及‘?=delete?’的使用

    這篇文章主要介紹了C++中?=default?及?=delete?使用,使用=default和=delete可以控制編譯器默認(rèn)函數(shù)體的使用,下面我們就來看看具體的室友方法吧,需要的朋友也可以參考一下
    2021-12-12
  • C++單例模式的實例詳解

    C++單例模式的實例詳解

    這篇文章主要介紹了C++單例模式的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言二維數(shù)組中的查找的實例

    C語言二維數(shù)組中的查找的實例

    這篇文章主要介紹了C語言二維數(shù)組中的查找的實例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++ 異常的詳細(xì)介紹

    C++ 異常的詳細(xì)介紹

    這篇文章主要介紹了C++ 異常的詳細(xì)介紹的相關(guān)資料,希望通過本文大家能夠掌握C++異常的使用方法,需要的朋友可以參考下
    2017-09-09
  • Qt實現(xiàn)數(shù)據(jù)進(jìn)行加密、解密的步驟

    Qt實現(xiàn)數(shù)據(jù)進(jìn)行加密、解密的步驟

    本文主要介紹了Qt實現(xiàn)數(shù)據(jù)進(jìn)行加密、解密的步驟,包含QCryptographicHash和Qt-AES兩種庫的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C++實現(xiàn)希爾排序(ShellSort)

    C++實現(xiàn)希爾排序(ShellSort)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)希爾排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論