自定义菜单项

自定义菜单项

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();              // 清空输入框
}

posted @ 2025-08-17 17:44  xiaoluosibky  阅读(7)  评论(0)    收藏  举报