演示效果:
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
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);
}