main.cpp
#include "qmenutest.h"
#include <QtWidgets/QApplication>
#include "menuwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMenuTest w;
w.show();
/* MenuWidget win;
win.show();*/
return a.exec();
}
menuwidget.h
#pragma once
#include <QWidget>
#include "ui_menuwidget.h"
#include <QDebug>
#include <QMenuBar>
class MenuWidget : public QWidget
{
Q_OBJECT
public:
MenuWidget(QWidget *parent = Q_NULLPTR);
~MenuWidget();
public slots:
void Hover()
{
qDebug() << "Hover";
}
void Action1()
{
qDebug() << "Action1";
}
void Action1(bool ischecked)
{
qDebug() << "Action1 = "<<ischecked;
}
void Action(QAction* act)
{
qDebug() << "Action " << act->text();
}
void Hovered(QAction* act)
{
//动态菜单
if (act->text() == QStringLiteral("菜单栏3"))
{
qDebug() << "Hovered " << act->text();
act->menu()->clear();
act->menu()->addAction(QStringLiteral("菜单3.1"));
act->menu()->addAction(QStringLiteral("菜单3.2"));
act->menu()->addAction(QStringLiteral("菜单3.3"));
}
}
void Click()
{
//鼠标位置显示菜单
m1->exec(QCursor::pos());
}
private:
QMenu* m1 = NULL;
Ui::MenuWidget ui;
};
menuwidget.cpp
#include "menuwidget.h"
#include <QToolBar>
#include <QStatusBar>
MenuWidget::MenuWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//插入菜单栏
QMenuBar* m = new QMenuBar(this);
m->resize(width(),m->height());
//绑定hovered信号,处理QMenuBar的子节点
connect(m,SIGNAL(hovered(QAction*)),this,SLOT(Hovered(QAction*)));
//一级菜单
m1 = m->addMenu(QStringLiteral("菜单1"));
//包含所有QMenu所有子节点,以及子节点的子节点
connect(m1,SIGNAL(triggered(QAction*)),this,SLOT(Action(QAction *)));
//二级菜单
QAction* a1 = m1->addAction(QStringLiteral("二级菜单1.1"));
//QAction触发信号
connect(a1,SIGNAL(triggered()),this,SLOT(Action1()));
//设置快捷方式
a1->setShortcut(QString("A"));
a1->setIcon(QIcon("qt.PNG"));
QAction* a2 = m1->addAction(QStringLiteral("二级菜单1.2"));
//QAction鼠标悬停事件
connect(a2,SIGNAL(hovered()),this,SLOT(Hover()));
QAction* a3 = m1->addAction(QStringLiteral("二级菜单1.3"));
//设置可选
a1->setCheckable(true);
a2->setCheckable(true);
a3->setCheckable(true);
//设置单选
QActionGroup* ag = new QActionGroup(this);
ag->addAction(a2);
ag->addAction(a3);
ag->setExclusive(true);
//是否选中事件,触发信号
connect(a1,SIGNAL(triggered(bool)),this,SLOT(Action1(bool)));
QMenu* m14 = m1->addMenu(QStringLiteral("二级菜单1.4"));
m14->addAction(QStringLiteral("三级菜单1.4.1"));
m14->setIcon(QIcon("qt.PNG"));
QMenu* m2 = m->addMenu(QStringLiteral("菜单栏2"));
QMenu* m3 = m->addMenu(QStringLiteral("菜单栏3"));
//工具栏
QToolBar* tbar = new QToolBar(this);
tbar->setGeometry(0,m->height(),width(),30);
tbar->setIconSize(QSize(30,30));
tbar->addAction(a1);
//实现消息定时消失
QStatusBar* sbar = new QStatusBar(this);
sbar->setGeometry(0, height() - 30, width(), 30);
sbar->showMessage(QStringLiteral("测试消息三秒消失!"), 3000);
}
MenuWidget::~MenuWidget()
{
}
ui_menuwidget.h
/********************************************************************************
** Form generated from reading UI file 'menuwidget.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MENUWIDGET_H
#define UI_MENUWIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MenuWidget
{
public:
QAction *actiontest;
QPushButton *pushButton;
void setupUi(QWidget *MenuWidget)
{
if (MenuWidget->objectName().isEmpty())
MenuWidget->setObjectName(QString::fromUtf8("MenuWidget"));
MenuWidget->resize(400, 300);
actiontest = new QAction(MenuWidget);
actiontest->setObjectName(QString::fromUtf8("actiontest"));
actiontest->setCheckable(true);
pushButton = new QPushButton(MenuWidget);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
pushButton->setGeometry(QRect(90, 120, 93, 28));
retranslateUi(MenuWidget);
QObject::connect(pushButton, SIGNAL(clicked()), MenuWidget, SLOT(Click()));
QMetaObject::connectSlotsByName(MenuWidget);
} // setupUi
void retranslateUi(QWidget *MenuWidget)
{
MenuWidget->setWindowTitle(QCoreApplication::translate("MenuWidget", "MenuWidget", nullptr));
actiontest->setText(QCoreApplication::translate("MenuWidget", "test", nullptr));
#if QT_CONFIG(shortcut)
actiontest->setShortcut(QCoreApplication::translate("MenuWidget", "Ctrl+X", nullptr));
#endif // QT_CONFIG(shortcut)
pushButton->setText(QCoreApplication::translate("MenuWidget", "PushButton", nullptr));
} // retranslateUi
};
namespace Ui {
class MenuWidget: public Ui_MenuWidget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MENUWIDGET_H
qmenutest.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_qmenutest.h"
class QMenuTest : public QMainWindow
{
Q_OBJECT
public:
QMenuTest(QWidget *parent = Q_NULLPTR);
private:
Ui::QMenuTestClass ui;
};
qmenutest.cpp
#include "qmenutest.h"
QMenuTest::QMenuTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//菜单栏
this->menuBar()->addAction("TestMenu1");
//状态栏
this->statusBar()->showMessage("status Bar");
//工具栏
ui.mainToolBar->addAction(QStringLiteral("按钮1"));
ui.mainToolBar->addAction(QIcon("qt.PNG"),QStringLiteral("按钮二"));
//文件显示在图标下面
ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
//左侧
{
QToolBar* t = new QToolBar(this);
t->addAction(QStringLiteral("左侧"));
this->addToolBar(Qt::LeftToolBarArea,t);
}
//右侧
{
QToolBar* t = new QToolBar(this);
t->addAction(QStringLiteral("右侧"));
this->addToolBar(Qt::RightToolBarArea, t);
}
//底部
{
QToolBar* t = new QToolBar(this);
t->addAction(QStringLiteral("底侧"));
this->addToolBar(Qt::BottomToolBarArea, t);
}
}
ui_qmenutest.h
/********************************************************************************
** Form generated from reading UI file 'qmenutest.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_QMENUTEST_H
#define UI_QMENUTEST_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_QMenuTestClass
{
public:
QMenuBar *menuBar;
QToolBar *mainToolBar;
QWidget *centralWidget;
QStatusBar *statusBar;
void setupUi(QMainWindow *QMenuTestClass)
{
if (QMenuTestClass->objectName().isEmpty())
QMenuTestClass->setObjectName(QString::fromUtf8("QMenuTestClass"));
QMenuTestClass->resize(600, 400);
menuBar = new QMenuBar(QMenuTestClass);
menuBar->setObjectName(QString::fromUtf8("menuBar"));
QMenuTestClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(QMenuTestClass);
mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
QMenuTestClass->addToolBar(mainToolBar);
centralWidget = new QWidget(QMenuTestClass);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
QMenuTestClass->setCentralWidget(centralWidget);
statusBar = new QStatusBar(QMenuTestClass);
statusBar->setObjectName(QString::fromUtf8("statusBar"));
QMenuTestClass->setStatusBar(statusBar);
retranslateUi(QMenuTestClass);
QMetaObject::connectSlotsByName(QMenuTestClass);
} // setupUi
void retranslateUi(QMainWindow *QMenuTestClass)
{
QMenuTestClass->setWindowTitle(QCoreApplication::translate("QMenuTestClass", "QMenuTest", nullptr));
} // retranslateUi
};
namespace Ui {
class QMenuTestClass: public Ui_QMenuTestClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_QMENUTEST_H