以下是在QT C++中实现弹出式菜单,在ui->tw_process上右键弹出菜单,菜单有以下几个按钮:[重选录制,删除选中,只选这个,全部选中,全部不选,重命名],其中的重录选中要求有个选择框,可以控制勾选或者不勾选的代码实现:

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

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

然后在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);

}

接下来实现槽函数: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);
}

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

}

然后实现其他槽函数:

// 重选录制 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: 实现重命名功能 }

其中,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; } } }

在弹出菜单时,我们可以添加一个选择框,代码如下:

void MainWindow::onCustomContextMenu(const QPoint& pos) { // ...

// 添加重录选中的选择框
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));

}

在弹出菜单时,如果m_actionReRecord可用,则会弹出一个选择框,让用户选择是否勾选“重录选中”选项。如果用户勾选了该选项,则菜单会被拆分成一个独立的窗口,方便用户选择多个选项时进行操作。如果用户没有勾选该选项,则菜单不会被拆分,仍然显示在原来的位置上

QT C++ 帮我编写一个弹出式菜单 在ui-tw_process上右键弹出菜单 菜单有一下几个按钮 重选录制删除选中只选这个全部选中全部不选重命名 其中的重录选中要求有个选择框可以控制勾选或者不勾选

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

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