QT C++ 实现右键弹出菜单,包含重选录制功能及选择框

本文介绍如何在 QT C++ 中实现右键弹出菜单,并添加“重选录制”功能,其中“重选录制”功能包含一个选择框,用户可以选择是否勾选“重录选中”。

1. 定义菜单和菜单项

首先在 mainwindow.h 文件中定义菜单和菜单项:

private:
    QMenu* m_menu; // 菜单
    QAction* m_actionReRecord; // 重选录制
    QAction* m_actionDeleteSelected; // 删除选中
    QAction* m_actionSelectOnlyThis; // 只选这个
    QAction* m_actionSelectAll; // 全部选中
    QAction* m_actionSelectNone; // 全部不选
    QAction* m_actionRename; // 重命名

2. 初始化菜单和菜单项

然后在 mainwindow.cpp 文件中初始化菜单和菜单项:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // ...

    // 初始化菜单和菜单项
    m_menu = new QMenu(ui->tw_process);
    m_actionReRecord = new QAction('重选录制', this);
    m_actionDeleteSelected = new QAction('删除选中', this);
    m_actionSelectOnlyThis = new QAction('只选这个', this);
    m_actionSelectAll = new QAction('全部选中', this);
    m_actionSelectNone = new QAction('全部不选', this);
    m_actionRename = new QAction('重命名', this);

    // 将菜单项添加到菜单中
    m_menu->addAction(m_actionReRecord);
    m_menu->addAction(m_actionDeleteSelected);
    m_menu->addAction(m_actionSelectOnlyThis);
    m_menu->addAction(m_actionSelectAll);
    m_menu->addAction(m_actionSelectNone);
    m_menu->addAction(m_actionRename);

    // 连接菜单项的槽函数
    connect(m_actionReRecord, &QAction::triggered, this, &MainWindow::onReRecord);
    connect(m_actionDeleteSelected, &QAction::triggered, this, &MainWindow::onDeleteSelected);
    connect(m_actionSelectOnlyThis, &QAction::triggered, this, &MainWindow::onSelectOnlyThis);
    connect(m_actionSelectAll, &QAction::triggered, this, &MainWindow::onSelectAll);
    connect(m_actionSelectNone, &QAction::triggered, this, &MainWindow::onSelectNone);
    connect(m_actionRename, &QAction::triggered, this, &MainWindow::onRename);

    // ...

    // 在ui->tw_process上右键弹出菜单
    ui->tw_process->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->tw_process, &QWidget::customContextMenuRequested, this, &MainWindow::onCustomContextMenu);
}

3. 实现弹出菜单的槽函数

接下来实现槽函数 onCustomContextMenu(),当在 ui->tw_process 上右键时弹出菜单:

void MainWindow::onCustomContextMenu(const QPoint& pos)
{
    // 获取选中的项
    QTreeWidgetItem* item = ui->tw_process->itemAt(pos);

    if (item != nullptr) {
        // 如果选中了某个项,则在菜单中显示“只选这个”和“重命名”选项
        m_actionSelectOnlyThis->setEnabled(true);
        m_actionRename->setEnabled(true);
    }
    else {
        // 如果没有选中任何项,则“只选这个”和“重命名”选项不可用
        m_actionSelectOnlyThis->setEnabled(false);
        m_actionRename->setEnabled(false);
    }

    // 添加重录选中的选择框
    if (m_actionReRecord->isEnabled()) {
        QDialog dialog(this);
        dialog.setWindowTitle('重录选中');
        dialog.setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
        QVBoxLayout layout(&dialog);

        QCheckBox cb_reRecord('重录选中', &dialog);
        cb_reRecord.setObjectName('cb_reRecord');
        layout.addWidget(&cb_reRecord);

        QPushButton btn_ok('确定', &dialog);
        btn_ok.setDefault(true);
        layout.addWidget(&btn_ok);

        connect(&btn_ok, &QPushButton::clicked, &dialog, &QDialog::accept);

        if (dialog.exec() == QDialog::Accepted) {
            // 弹出菜单时选择了“重录选中”
            if (cb_reRecord.isChecked()) {
                m_menu->setTearOffEnabled(true);
                m_menu->setTearOffMenuVisible(true);
            }
            else {
                m_menu->setTearOffEnabled(false);
                m_menu->setTearOffMenuVisible(false);
            }
        }
    }
    else {
        m_menu->setTearOffEnabled(false);
        m_menu->setTearOffMenuVisible(false);
    }

    // 弹出菜单
    m_menu->exec(ui->tw_process->mapToGlobal(pos));
}

4. 实现其他槽函数

然后实现其他槽函数,例如 onReRecord()onDeleteSelected() 等。这些函数的具体实现取决于你的应用需求,此处仅提供示例代码:

// 重选录制
void MainWindow::onReRecord()
{
    // 判断是否勾选了“重录选中”
    bool reRecordSelected = false;
    if (m_menu->isTearOffMenuVisible()) {
        QWidget* widget = m_menu->tearOffWidget();
        if (widget != nullptr) {
            QCheckBox* checkBox = widget->findChild<QCheckBox*>('cb_reRecord');
            if (checkBox != nullptr && checkBox->isChecked()) {
                reRecordSelected = true;
            }
        }
    }

    // TODO: 实现重选录制功能
}

// 删除选中
void MainWindow::onDeleteSelected()
{
    // TODO: 实现删除选中功能
}

// 只选这个
void MainWindow::onSelectOnlyThis()
{
    // TODO: 实现只选这个功能
}

// 全部选中
void MainWindow::onSelectAll()
{
    // TODO: 实现全部选中功能
}

// 全部不选
void MainWindow::onSelectNone()
{
    // TODO: 实现全部不选功能
}

// 重命名
void MainWindow::onRename()
{
    // TODO: 实现重命名功能
}

5. 总结

以上代码实现了在 QT C++ 中实现右键弹出菜单,并添加“重选录制”功能,其中“重选录制”功能包含一个选择框,用户可以选择是否勾选“重录选中”。该代码仅供参考,具体的实现需要根据你的应用需求进行调整。

QT C++ 实现右键弹出菜单,包含重选录制功能及选择框

原文地址: https://www.cveoy.top/t/topic/nyuK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录