Qt5.12实战之菜单栏工具栏与状态栏使用

演示效果:

1.widget工程创建

2.ui设计

双击打开下图所示的.ui文件

 

 菜单设计:

添加子菜单

 

修改QMenu及QAction对象名称为可识别名

 具体修改操作如下:

QMenu和QAction类似

 

在QAction列表中修改QAction对象

 

具体修改方法如下:

 

 

为QAction也就是菜单项目添加点击事件处理:

 

选择信号后,然后点击OK后,会自动关联信号,并实现槽函数 

 

 自动添加的槽

槽实现:

 

断点验证,点击新建菜单,成功进入对就的槽函数体中:

 

 成功响应菜单点击

 上面是通过设计窗口添加的菜单,与为菜单添加点击事件处理

下面为通过代码动态添加主菜单(一级菜单)及子菜单(二级菜单)如下图示

 1.创建一个菜单项:

  QMenu *toolMenu =new QMenu();
    toolMenu->setTitle(QStringLiteral("主菜单"));

2.创建一个子菜单(QAction)

QAction *toolsAction = new QAction(QStringLiteral("子菜单"));

3. 添加子菜单到主菜单

toolMenu->addAction(toolsAction);

4.添加菜单项到菜单栏

 ui->menubar->addMenu(toolMenu);

此时,运行程序,菜单栏可看到主菜单了,点击主菜单也会弹出 子菜单

 接下来为主菜单与子菜单关联信号与槽,使菜单点击有响应

 //子菜单点击事件
    connect(toolsAction,SIGNAL(triggered()),this,SLOT(OnCustMenuTriggered()));
    //菜单点击事件
    connect(toolMenu,SIGNAL(triggered(QAction*)),this,SLOT(OnCustMenuMainTriggered(QAction*)));

关联槽函数前,先定义与实现

定义:

 //自定义菜单点击事件槽
    void OnCustMenuTriggered();
    //
    void OnCustMenuMainTriggered(QAction *act);

实现:

void MainWindow::OnCustMenuTriggered()
{
    QMessageBox::information(this,this->windowTitle(),QStringLiteral("%1菜单点击").arg("123"));
}

void MainWindow::OnCustMenuMainTriggered(QAction *act)
{
    QMessageBox::information(this,this->windowTitle(),QStringLiteral("%1菜单点击").arg(act->text()));
}

现在,点击菜单有响应了

工具栏的实现与菜单栏的实现基本类似

唯一不同的是位置容器

 和工具栏添加工具按钮的方法如下: (没有图标的工具栏只显示文本,有图标的,默认显示图标)

 为工具栏的工具按钮关联信号与槽

选择信号后,点击OK,会自动创建槽函数

在槽函数中实现相关的功能,点击该工具按钮时会执行到该槽函数中,执行实现的功能 

 工具按钮点击响应效果如下:

通过设计界面添加的方法很简单,下面通过代码来实现同样的功能

1.创建QAction

_ContextMenuAct = new QAction(QStringLiteral("退出"));

 2.为QAction设置图标

 QIcon icon;
    icon.addFile(QString::fromUtf8(":/res/mfc.ico"), QSize(), QIcon::Normal, QIcon::Off);
    _ContextMenuAct->setIcon(icon);

 3.取得UI设计器生成的工具栏对象,并向工具栏添加QAction

 ui->toolBar->addAction(_ContextMenuAct);

完成上面3步后,会自动向工具栏添加一个按钮

实时时:

 运行后: 成功动态添加了一个工具栏按钮

 下面来实现动态添加的工具栏按钮的信号与槽的关联

可通过实现器实现

 也可通过自定义信号与槽,使用connet来关联(参考上面菜单实现方式)

最后,通过代码来实现状态栏挂件的动态添加并实现槽

1.先取得状态栏对象

 QStatusBar *_status=statusBar();

2.向状态栏添加对象

向状态栏添加标签

 QLabel *_labtmp = new QLabel;
    _labtmp->setMinimumSize(200,30);
    _labtmp->setFrameShadow(QFrame::Sunken);
    _labtmp->setText(QStringLiteral("一般信息:破解吧,哥们!"));
    _status->addWidget(_labtmp);

向状态栏添加按钮:

 QPushButton *_btn = new QPushButton();
    _btn->setText(QStringLiteral("入侵"));
    _status->addWidget(_btn);
    connect(_btn,SIGNAL(clicked()),this,SLOT(OnStatusBtnClicked()));

向状态栏添加永久性信息:

_status->addPermanentWidget(new QLabel(QStringLiteral("永久信息:让入侵成为一种快乐吧!")));

实现效果:

 完整实现代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionnew_triggered();

    void on_actionexit_triggered();

    void on_actioncopy_triggered();

    void on_actionparse_triggered();

    void on_actionabout_triggered();

    void on_actiontoolNew_triggered();
    //自定义菜单点击事件槽
    void OnCustMenuTriggered();
    //
    void OnCustMenuMainTriggered(QAction *act);
    void on_MainWindow_customContextMenuRequested(const QPoint &pos);
    void OnContextMenuExit();
    void OnStatusBtnClicked();
private:
    Ui::MainWindow *ui;
    void MenuActionEvent(QString text);
    QMenu *_contextMenu;
    QAction *_ContextMenuAct;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(QStringLiteral("Qt菜单与工具栏与状态栏测试"));

    //通过代码添加菜单项
    QMenu *toolMenu =new QMenu();
    toolMenu->setTitle(QStringLiteral("主菜单"));
    QAction *toolsAction = new QAction(QStringLiteral("子菜单"));
    toolMenu->addAction(toolsAction);//添加子菜单到主菜单
    ui->menubar->addMenu(toolMenu);//添加到菜单栏
    //子菜单点击事件
    connect(toolsAction,SIGNAL(triggered()),this,SLOT(OnCustMenuTriggered()));
    //菜单点击事件
    connect(toolMenu,SIGNAL(triggered(QAction*)),this,SLOT(OnCustMenuMainTriggered(QAction*)));

    //初始化上下文件菜单
    _contextMenu = new QMenu(this);
    _ContextMenuAct = new QAction(QStringLiteral("退出"));
    _contextMenu->addAction(_ContextMenuAct);
    connect(_ContextMenuAct,SIGNAL(triggered()),this,SLOT(OnContextMenuExit()));

    //添加工具栏按钮
    QIcon icon;
    icon.addFile(QString::fromUtf8(":/res/mfc.ico"), QSize(), QIcon::Normal, QIcon::Off);
    _ContextMenuAct->setIcon(icon);
    ui->toolBar->addAction(_ContextMenuAct);

    //状态栏操作
    QStatusBar *_status=statusBar();
    QLabel *_labtmp = new QLabel;
    _labtmp->setMinimumSize(200,30);
    _labtmp->setFrameShadow(QFrame::Sunken);
    _labtmp->setText(QStringLiteral("一般信息:破解吧,哥们!"));
    _status->addWidget(_labtmp);


    //添加状态栏一般信息
    QLabel *_lab = new QLabel;
    _lab->setMinimumSize(200,30);
    _lab->setFrameShadow(QFrame::Sunken);
    _lab->setText(QStringLiteral("一般信息:入侵吧,哥们!"));
    _status->addWidget(_lab);

    QPushButton *_btn = new QPushButton();
    _btn->setText(QStringLiteral("入侵"));
    _status->addWidget(_btn);
    connect(_btn,SIGNAL(clicked()),this,SLOT(OnStatusBtnClicked()));
    //添加状态栏永久信息
    _status->addPermanentWidget(new QLabel(QStringLiteral("永久信息:让入侵成为一种快乐吧!")));



}

MainWindow::~MainWindow()
{
    delete ui;
}

//新建子菜槽函数实现
void MainWindow::on_actionnew_triggered()
{
     MenuActionEvent(ui->actionnew->text());
}


void MainWindow::on_actionexit_triggered()
{
    MenuActionEvent(ui->actionexit->text());
    QApplication::exit(0);
}


void MainWindow::on_actioncopy_triggered()
{
     MenuActionEvent(ui->actioncopy->text());
}


void MainWindow::on_actionparse_triggered()
{
     MenuActionEvent(ui->actionparse->text());
}


void MainWindow::on_actionabout_triggered()
{
    MenuActionEvent(ui->actionabout->text());
}

void MainWindow::MenuActionEvent(QString text)
{
     QMessageBox::information(this,this->windowTitle(),QStringLiteral("%1菜单点击").arg(text));
}


void MainWindow::on_actiontoolNew_triggered()
{
    MenuActionEvent(ui->actiontoolNew->text());
}

void MainWindow::OnCustMenuTriggered()
{
    QMessageBox::information(this,this->windowTitle(),QStringLiteral("%1菜单点击").arg("123"));
}

void MainWindow::OnCustMenuMainTriggered(QAction *act)
{
    QMessageBox::information(this,this->windowTitle(),QStringLiteral("%1菜单点击").arg(act->text()));
}


void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &pos)
{
    _contextMenu->exec(cursor().pos());
}

void MainWindow::OnContextMenuExit()
{
    QApplication::exit(0);

}

void MainWindow::OnStatusBtnClicked()
{
    QMessageBox::information(this,NULL,QStringLiteral("入侵成功!"));
     QStatusBar *_status=statusBar();
     //添加状态栏临时信息
     _status->showMessage(QStringLiteral("入侵远程主机成功!恭喜你!"),2000);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宏权实验室

有你的鼓励,我会更加努力。

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

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

打赏作者

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

抵扣说明:

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

余额充值