自定义菜单项
mainwindow
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTextEdit>
#include <QMdiSubWindow>
#include <QMenu>
#include <QIcon>
#include <QActionGroup>
#include "myaction.h"
#include <QToolButton>
#include <QSpinBox>
#include <QLabel>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); // 初始化 UI(加载 .ui 文件里的界面元素)
// ====== 菜单栏:编辑菜单 ======
QMenu * editMenu = ui->menubar->addMenu(tr("编辑(&E)"));
editMenu->addSeparator();
// “打开文件”动作,带图标和快捷键
QAction * action_Open = editMenu->addAction(QIcon(":/res/1.png"), tr("打开文件(&O)"));
action_Open->setShortcut(QKeySequence("Ctrl+O"));
connect(action_Open, &QAction::triggered, this, &MainWindow::on_actionEdit_triggered);
// ====== 菜单栏:对齐方式分组 ======
QActionGroup * group = new QActionGroup(this); // 用于分组,保证互斥选择
QAction * action_L = group->addAction(tr("左对齐(&L)"));
action_L->setCheckable(true);
QAction * action_R = group->addAction(tr("右对齐(&L)"));
action_R->setCheckable(true);
QAction * action_C = group->addAction(tr("居中(&L)"));
action_C->setCheckable(true);
editMenu->addSeparator();
editMenu->addAction(action_L);
editMenu->addAction(action_R);
editMenu->addAction(action_C);
// ====== 自定义的 MyAction(输入框+标签) ======
MyAction * action = new MyAction(this);
editMenu->addAction(action);
connect(action, &MyAction::getText, this, &MainWindow::slot_set_text);
// ====== 工具栏:带下拉菜单的按钮 ======
QToolButton * toolBtn = new QToolButton(this);
toolBtn->setText(tr("颜色"));
ui->toolBar->addWidget(toolBtn);
QMenu * colorMenu = new QMenu(this);
colorMenu->addAction(tr("红色"));
colorMenu->addAction(tr("绿色"));
toolBtn->setMenu(colorMenu);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup); // 设置弹出模式
// ====== 工具栏:添加一个分隔符 + 微调框 ======
ui->toolBar->addSeparator();
QSpinBox * spinBox = new QSpinBox(this);
ui->toolBar->addWidget(spinBox);
// ====== 状态栏:临时信息 ======
ui->statusbar->showMessage(tr("欢迎使用多文档编辑器"), 2000);
// ====== 状态栏:永久信息标签 ======
QLabel * permnant = new QLabel(this);
permnant->setFrameStyle(QFrame::Box | QFrame::Sunken); // 设置边框风格
permnant->setText("abcd.club");
ui->statusbar->addPermanentWidget(permnant);
}
MainWindow::~MainWindow()
{
delete ui;
}
// ======================= 槽函数 =======================
// 点击菜单 “显示Dock窗口”
void MainWindow::on_actionshowdock_D_triggered()
{
qDebug() << "显示dock widget " << Qt::endl;
ui->dockWidget_2->show();
}
// 点击菜单 “新建文件”
void MainWindow::on_actionNew_N_triggered()
{
// 新建一个文本编辑子窗口
QTextEdit * textEdit = new QTextEdit(this);
auto childWindow = ui->mdiArea->addSubWindow(textEdit); // 加到 MDI 区域
childWindow->setWindowTitle(tr("文本编辑子窗口"));
childWindow->show();
}
// 点击菜单 “编辑->打开文件”
void MainWindow::on_actionEdit_triggered()
{
qDebug() << "打开文件..." << Qt::endl;
}
// 自定义 MyAction 触发时,设置主编辑区内容
void MainWindow::slot_set_text(const QString &string)
{
ui->textEdit->setText(string);
}
myaction
#include "myaction.h"
#include <QSplitter>
#include <QLabel>
#include <QSplitter>
// 自定义 QAction 类,继承自 QWidgetAction
// QWidgetAction 允许在菜单或工具栏中放置 QWidget 控件
MyAction::MyAction(QObject *parent) : QWidgetAction(parent)
{
// 创建一个行编辑器(输入框)
lineEdit = new QLineEdit();
// 连接行编辑器的回车信号,当用户按下 Enter 键时,
// 自动调用 sendText() 槽函数
connect(lineEdit, &QLineEdit::returnPressed,
this, &MyAction::sendText);
}
// 重写 QWidgetAction 的 createWidget()
// 用于生成一个自定义的 QWidget(插入到菜单或工具栏里)
// parent 是父容器(QMenu 或 QToolBar)
QWidget *MyAction::createWidget(QWidget *parent)
{
// 如果 parent 既不是 QMenu 也不是 QToolBar,则返回空
if(!(parent->inherits("QMenu")) && !(parent->inherits("QToolBar"))){
return 0;
}
// 创建一个分隔控件 QSplitter,用来水平排列子控件
QSplitter * spliter = new QSplitter(parent);
// 创建一个标签,显示提示文字
QLabel * label = new QLabel;
label->setText("插入文本");
// 把标签和输入框加入分隔控件中
spliter->addWidget(label);
spliter->addWidget(lineEdit);
// 返回整个组合控件
return spliter;
}
// 槽函数:当用户按下 Enter 键时触发
// 发射自定义信号 getText(),把输入的内容传递出去
// 然后清空输入框
void MyAction::sendText()
{
emit getText(lineEdit->text()); // 发射信号
lineEdit->clear(); // 清空输入框
}