11、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);



}

ui界面布局样式:

qmenutest布局样式

在这里插入图片描述

testmenuwidget布局样式

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳一航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值