QT C++ 帮我编写一个弹出式菜单 在ui-tw_process上右键弹出菜单 菜单有一下几个按钮 重选录制删除选中只选这个全部选中全部不选重命名 其中的重录选中要求有个选择框可以控制勾选或者不勾选
以下是在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可用,则会弹出一个选择框,让用户选择是否勾选“重录选中”选项。如果用户勾选了该选项,则菜单会被拆分成一个独立的窗口,方便用户选择多个选项时进行操作。如果用户没有勾选该选项,则菜单不会被拆分,仍然显示在原来的位置上
原文地址: https://www.cveoy.top/t/topic/cHtk 著作权归作者所有。请勿转载和采集!