QT::TestMenuWidget操作
前言:
本文操作均为在vs2015+QT5.9.5版本中执行
头文件:.h
头文件:qmenutest.h
#pragma once
#include <QWidget>
#include "ui_qmenutest.h"
class QMenuTest : public QWidget
{
Q_OBJECT
public:
QMenuTest(QWidget *parent = Q_NULLPTR);
~QMenuTest();
public slots:
void Hover();
void Trigger();
void Trigger(QAction *act);
void Hover(QAction *act);
void Triggered(bool checked);
void Click();
private:
//将m1设置为成员
QMenu *m1 = NULL;
Ui::QMenuTest ui;
};
头文件:testmenuwidget.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_testmenuwidget.h"
class TestMenuWidget : public QMainWindow
{
Q_OBJECT
public:
TestMenuWidget(QWidget *parent = Q_NULLPTR);
private:
Ui::TestMenuWidgetClass ui;
};
UI文件:ui_.h
UI文件:qmenutest.ui
/********************************************************************************
** Form generated from reading UI file 'qmenutest.ui'
**
** Created by: Qt User Interface Compiler version 5.9.5
**
** 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/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_QMenuTest
{
public:
QAction *actionactionText_Test;
QPushButton *pushButton;
void setupUi(QWidget *QMenuTest)
{
if (QMenuTest->objectName().isEmpty())
QMenuTest->setObjectName(QStringLiteral("QMenuTest"));
QMenuTest->resize(930, 520);
actionactionText_Test = new QAction(QMenuTest);
actionactionText_Test->setObjectName(QStringLiteral("actionactionText_Test"));
pushButton = new QPushButton(QMenuTest);
pushButton->setObjectName(QStringLiteral("pushButton"));
pushButton->setGeometry(QRect(300, 220, 171, 71));
retranslateUi(QMenuTest);
QMetaObject::connectSlotsByName(QMenuTest);
} // setupUi
void retranslateUi(QWidget *QMenuTest)
{
QMenuTest->setWindowTitle(QApplication::translate("QMenuTest", "QMenuTest", Q_NULLPTR));
actionactionText_Test->setText(QApplication::translate("QMenuTest", "actionText_Test", Q_NULLPTR));
#ifndef QT_NO_SHORTCUT
actionactionText_Test->setShortcut(QApplication::translate("QMenuTest", "Ctrl+C", Q_NULLPTR));
#endif // QT_NO_SHORTCUT
pushButton->setText(QApplication::translate("QMenuTest", "\350\217\234\345\215\225\344\270\200\346\230\276\347\244\272", Q_NULLPTR));
} // retranslateUi
};
namespace Ui {
class QMenuTest: public Ui_QMenuTest {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_QMENUTEST_H
UI文件:testmenuwidget.ui
/********************************************************************************
** Form generated from reading UI file 'testmenuwidget.ui'
**
** Created by: Qt User Interface Compiler version 5.9.5
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_TESTMENUWIDGET_H
#define UI_TESTMENUWIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_TestMenuWidgetClass
{
public:
QAction *actionone;
QAction *actiontwo;
QAction *actionthree;
QWidget *centralWidget;
QMenuBar *menuBar;
QMenu *menu;
QMenu *menu_2;
QMenu *menu_3;
QToolBar *mainToolBar;
QStatusBar *statusBar;
void setupUi(QMainWindow *TestMenuWidgetClass)
{
if (TestMenuWidgetClass->objectName().isEmpty())
TestMenuWidgetClass->setObjectName(QStringLiteral("TestMenuWidgetClass"));
TestMenuWidgetClass->resize(600, 400);
actionone = new QAction(TestMenuWidgetClass);
actionone->setObjectName(QStringLiteral("actionone"));
actiontwo = new QAction(TestMenuWidgetClass);
actiontwo->setObjectName(QStringLiteral("actiontwo"));
actionthree = new QAction(TestMenuWidgetClass);
actionthree->setObjectName(QStringLiteral("actionthree"));
centralWidget = new QWidget(TestMenuWidgetClass);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
TestMenuWidgetClass->setCentralWidget(centralWidget);
menuBar = new QMenuBar(TestMenuWidgetClass);
menuBar->setObjectName(QStringLiteral("menuBar"));
menuBar->setGeometry(QRect(0, 0, 600, 23));
menu = new QMenu(menuBar);
menu->setObjectName(QStringLiteral("menu"));
menu_2 = new QMenu(menuBar);
menu_2->setObjectName(QStringLiteral("menu_2"));
menu_3 = new QMenu(menuBar);
menu_3->setObjectName(QStringLiteral("menu_3"));
TestMenuWidgetClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(TestMenuWidgetClass);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
TestMenuWidgetClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
statusBar = new QStatusBar(TestMenuWidgetClass);
statusBar->setObjectName(QStringLiteral("statusBar"));
TestMenuWidgetClass->setStatusBar(statusBar);
menuBar->addAction(menu->menuAction());
menuBar->addAction(menu_2->menuAction());
menuBar->addAction(menu_3->menuAction());
menu->addAction(actionone);
menu_2->addAction(actiontwo);
menu_3->addAction(actionthree);
retranslateUi(TestMenuWidgetClass);
QMetaObject::connectSlotsByName(TestMenuWidgetClass);
} // setupUi
void retranslateUi(QMainWindow *TestMenuWidgetClass)
{
TestMenuWidgetClass->setWindowTitle(QApplication::translate("TestMenuWidgetClass", "TestMenuWidget", Q_NULLPTR));
actionone->setText(QApplication::translate("TestMenuWidgetClass", "one", Q_NULLPTR));
actiontwo->setText(QApplication::translate("TestMenuWidgetClass", "two", Q_NULLPTR));
actionthree->setText(QApplication::translate("TestMenuWidgetClass", "three", Q_NULLPTR));
menu->setTitle(QApplication::translate("TestMenuWidgetClass", "\350\217\234\345\215\225\344\270\200", Q_NULLPTR));
menu_2->setTitle(QApplication::translate("TestMenuWidgetClass", "\350\217\234\345\215\225\344\272\214", Q_NULLPTR));
menu_3->setTitle(QApplication::translate("TestMenuWidgetClass", "\350\217\234\345\215\225\344\270\211", Q_NULLPTR));
} // retranslateUi
};
namespace Ui {
class TestMenuWidgetClass: public Ui_TestMenuWidgetClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_TESTMENUWIDGET_H
主函数:main.cpp
#include "testmenuwidget.h"
#include <QtWidgets/QApplication>
#include "qmenutest.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
自己创建的窗口(自定义菜单、工具、状态栏)
//QMenuTest m;
//m.show();
TestMenuWidget w;
w.show();
return a.exec();
}
实现文件:.cpp
实现文件:qmenutest.cpp
#include "qmenutest.h"
#include<QMenuBar>
#include <QToolBar>
#include<QStatusBar>
#include <QPushButton>
#include<QDebug>
QMenuTest::QMenuTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//构建一个菜单栏
QMenuBar *m = new QMenuBar(this);
//设置菜单栏“宽(同步widget的宽)”和“高(维持默认高度)”
m->resize(width(), m->height());
//创建一级菜单
m1 = m->addMenu(QString::fromLocal8Bit("菜单一"));
QMenu *m2 = m->addMenu(QString::fromLocal8Bit("菜单二"));
QMenu *m3 = m->addMenu(QString::fromLocal8Bit("菜单三"));
//创建二级菜单
QAction *a1 = m1->addAction(QString::fromLocal8Bit("二级菜单_1"));
QAction *a2 = m1->addAction(QString::fromLocal8Bit("二级菜单_2"));
QAction *a3 = m1->addAction(QString::fromLocal8Bit("二级菜单_3"));
//创建三级菜单
QMenu *m4 = m1->addMenu(QString::fromLocal8Bit("菜单四"));
QAction *a4_1 = m4->addAction(QString::fromLocal8Bit("三级菜单_1"));
//添加Icon图片
a1->setIcon(QIcon("five.png"));
a3->setIcon(QIcon("five.png"));
m4->setIcon(QIcon("five.png"));
a4_1->setIcon(QIcon("five.png"));
//链接信号与槽
//测试鼠标悬停事件
connect(a2, SIGNAL(hovered()), this, SLOT(Hover()));
//测试鼠标点击事件(PS:如果二级菜单内还有三级菜单,二级菜单不会有效果)
connect(a1, SIGNAL(triggered()), this, SLOT(Trigger()));
//鼠标点击后打印文本信息(PS:如果二级菜单内还有三级菜单,二级菜单不会有效果)
connect(m1, SIGNAL(triggered(QAction *)), this, SLOT(Trigger(QAction *)));
//动态生成菜单列表,利用鼠标悬停事件提前生成;
connect(m, SIGNAL(hovered(QAction *)), this, SLOT(Hover(QAction *)));
//检测是否选中(PS:只有在多选模式下有用)
connect(a1, SIGNAL(triggered(bool)), this, SLOT(Triggered(bool)));
//pushButton绑定菜单事件
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(Click()));
//控件设置
//设置为多选模式
a1->setCheckable(true);
a2->setCheckable(true);
a3->setCheckable(true);
//将菜单里的控件组合在一起,方便统一设置动作
QActionGroup *ag = new QActionGroup(this);
//ag->addAction(a1);
ag->addAction(a2);
ag->addAction(a3);
//单选
ag->setExclusive(true);
//添加快捷键
/*
添加ui中生成的子菜单+快捷键方法:
视图->打开动作编辑器->新建->输入文本名以及Shortcut处设置快捷方式
->点击ok即可->之后如下代码一样;
在菜单栏二中添加子菜单->ui获取到actionText_Test即可;
m2->addAction(ui.actionText_Test);
*/
m2->addAction(ui.actionactionText_Test);
a1->setShortcut(QString("a"));//添加快捷键
//添加“工具栏”及“状态栏”
//工具栏添加
QToolBar *thar = new QToolBar(this);
//设置工具栏(x轴位置,y轴位置,长度,宽度)
thar->setGeometry(0, m->height(), width(), 30);
//设置Icon大小
thar->setIconSize(QSize(30, 30));
//添加菜单按键
thar->addAction(a1);
//状态栏添加(PS:可以实现消息定时消失)
QStatusBar *shar = new QStatusBar(this);
//设置状态栏 位置、大小
//setGeometry(x轴位置设置为0, 窗口高度-30得出y轴, 设置和窗口一样长, 宽度设置为30);
shar->setGeometry(0, height() - 30, width(), 30);
//设置文本显示
//showMessage(const QString &文本, int 时间 );
shar->showMessage(QString::fromLocal8Bit("文本显示三秒后消失"), 3000);
}
QMenuTest::~QMenuTest()
{
}
void QMenuTest::Hover()
{
qDebug() << "Hover";
}
void QMenuTest::Trigger()
{
qDebug() << "Trigger 1";
}
void QMenuTest::Trigger(QAction *act)
{
qDebug() << "Trigger 1" << act->text();
}
void QMenuTest::Hover(QAction *act)
{
if (act->text() == QString::fromLocal8Bit("菜单三"))
{
qDebug() << "Hover" << act->text();
//(1)指定菜单->清空原有的
act->menu()->clear();
//(2)指定菜单->重新生成新的子节点。
act->menu()->addAction(QString::fromLocal8Bit("菜单三_一"));
act->menu()->addAction(QString::fromLocal8Bit("菜单三_二"));
act->menu()->addAction(QString::fromLocal8Bit("菜单三_三"));
}
}
void QMenuTest::Triggered(bool checked)
{
//检测单选或者多选的选中状态,只有在多选情况下有用
qDebug() << "Triggered =" << checked;
}
//显示菜单一内容
void QMenuTest::Click()
{
//菜单一的内容绑定到pushButton中显示
m1->exec(QCursor::pos());
}
实现文件:testmenuwidget.cpp
#include "testmenuwidget.h"
TestMenuWidget::TestMenuWidget(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//添加菜单栏
this->menuBar()->addAction("Test menu 1");
//添加状态栏
this->statusBar()->showMessage("status Bar");
//添加工具栏
//仅显示文字
ui.mainToolBar->addAction(QString::fromLocal8Bit("按钮一"));
//显示文字与图片
ui.mainToolBar->addAction(QIcon("boy1.png"),QString::fromLocal8Bit("按钮二"));//仅显示图片,不显示文字
//文字显示在图片下方
ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
//文字显示在图片右边
//ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//只显示文字
//ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonTextOnly);
//工具按钮跟随样式
//ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonFollowStyle);
//只显示图片
//ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
this->addToolBarBreak();//工具栏换行(PS:这是一个函数);
//默认顶部插入(PS:只要顶部工具栏有空位,就是插在顶部工具栏右边)
QToolBar *tb = this->addToolBar("Tool Bar 1");
tb->addAction(QString::fromLocal8Bit("按钮1"));
//左侧插入
QToolBar *tb1 = new QToolBar(this);
tb1->addAction(QString::fromLocal8Bit("左侧"));
this->addToolBar(Qt::LeftToolBarArea, tb1);
//右侧插入
QToolBar *tb2 = new QToolBar(this);
tb2->addAction(QString::fromLocal8Bit("右侧"));
this->addToolBar(Qt::RightToolBarArea, tb2);
//底部插入
QToolBar *tb3 = new QToolBar(this);
tb3->addAction(QString::fromLocal8Bit("底部"));
this->addToolBar(Qt::BottomToolBarArea, tb3);
//顶部插入第二种方法
this->addToolBarBreak();//工具栏换行
QToolBar *tb4 = new QToolBar(this);
tb4->addAction(QString::fromLocal8Bit("顶部插入方法二"));
this->addToolBar(Qt::TopToolBarArea, tb4);
}