QT C++ 实现右键弹出菜单,包含重选录制功能及选择框
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++ 中实现右键弹出菜单,并添加“重选录制”功能,其中“重选录制”功能包含一个选择框,用户可以选择是否勾选“重录选中”。该代码仅供参考,具体的实现需要根据你的应用需求进行调整。
原文地址: https://www.cveoy.top/t/topic/nyuK 著作权归作者所有。请勿转载和采集!