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

演示效果:

Qt5.12实战之菜单栏工具栏与状态栏使用_第1张图片

Qt5.12实战之菜单栏工具栏与状态栏使用_第2张图片

1.widget工程创建

Qt5.12实战之菜单栏工具栏与状态栏使用_第3张图片

2.ui设计

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第4张图片 

 菜单设计:

Qt5.12实战之菜单栏工具栏与状态栏使用_第5张图片

添加子菜单

Qt5.12实战之菜单栏工具栏与状态栏使用_第6张图片 

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第7张图片 具体修改操作如下:

QMenu和QAction类似

Qt5.12实战之菜单栏工具栏与状态栏使用_第8张图片 

在QAction列表中修改QAction对象

Qt5.12实战之菜单栏工具栏与状态栏使用_第9张图片 

具体修改方法如下:

Qt5.12实战之菜单栏工具栏与状态栏使用_第10张图片 

Qt5.12实战之菜单栏工具栏与状态栏使用_第11张图片 

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

 

Qt5.12实战之菜单栏工具栏与状态栏使用_第12张图片

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

 Qt5.12实战之菜单栏工具栏与状态栏使用_第13张图片

 自动添加的槽

Qt5.12实战之菜单栏工具栏与状态栏使用_第14张图片

槽实现:

Qt5.12实战之菜单栏工具栏与状态栏使用_第15张图片 

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第16张图片 

 成功响应菜单点击

Qt5.12实战之菜单栏工具栏与状态栏使用_第17张图片

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

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第18张图片

 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()));
}

现在,点击菜单有响应了

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

唯一不同的是位置容器

Qt5.12实战之菜单栏工具栏与状态栏使用_第19张图片

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第20张图片

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第21张图片

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第22张图片

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第23张图片 工具按钮点击响应效果如下:

Qt5.12实战之菜单栏工具栏与状态栏使用_第24张图片

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

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步后,会自动向工具栏添加一个按钮

实时时:

Qt5.12实战之菜单栏工具栏与状态栏使用_第25张图片

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

Qt5.12实战之菜单栏工具栏与状态栏使用_第26张图片

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

可通过实现器实现

Qt5.12实战之菜单栏工具栏与状态栏使用_第27张图片

 也可通过自定义信号与槽,使用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 

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 
#include 
#include 

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);
}

你可能感兴趣的:(QT编程,qt,开发语言)