gpt4 book ai didi

c++ - Qt 右键单击​​ QListWidget 打开上下文菜单并删除项目

转载 作者:IT老高 更新时间:2023-10-28 23:13:06 26 4
gpt4 key购买 nike

我想知道如何在右键单击表格项目时打开弹出菜单。在弹出菜单中应该给出一些操作,如添加和删除,这将创建一个新行或删除选定的行。

我是 Qt 世界的新手,所以如果有人能给我完整的详细信息(如果可能的话,附上代码),我将非常感谢他/她。

谢谢。

我的目标:只有在QListWidget区域,并且只有点击一个item,才会打开带有Delete的菜单。


Edit :好的,我解决了 QListWidget 和菜单的问题。现在必须完成以下工作:

如果您用鼠标右键单击一个项目,然后单击删除,则该项目将被删除。

我的代码:


void ProvideContextMenu(const QPoint &); // MainWindow.h
// In MainWindow.cpp

ui->listFiles->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->listFiles, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(ProvideContextMenu(const QPoint &)));

void MainWindow::ProvideContextMenu(const QPoint &pos)
{
QPoint item = ui->listFiles->mapToGlobal(pos);
QMenu submenu;
submenu.addAction("ADD");
submenu.addAction("Delete");
QAction* rightClickItem = submenu.exec(item);
if (rightClickItem && rightClickItem->text().contains("Delete") )
{
ui->listFiles->takeItem(ui->listFiles->indexAt(pos).row());
}
}

Edit2:好的,我解决了整个问题:D。我上传了我的代码,如果有人需要类似的东西,它可以帮助他/她。

最佳答案

首先您需要创建用于打开上下文菜单的插槽:

void showContextMenu(const QPoint&);

在你的类的构造函数中,它使用了 QListWidgetset context menu policy自定义和连接 QListWidget::customContextMenuRequested(QPoint) 信号和 showContextMenu() 插槽,如下所示:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setupUi(this);

listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(listWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint)));
}

然后需要实现上下文菜单打开:

void MainWindow::showContextMenu(const QPoint &pos)
{
// Handle global position
QPoint globalPos = listWidget->mapToGlobal(pos);

// Create menu and insert some actions
QMenu myMenu;
myMenu.addAction("Insert", this, SLOT(addItem()));
myMenu.addAction("Erase", this, SLOT(eraseItem()));

// Show context menu at handling position
myMenu.exec(globalPos);
}

在这之后我们需要实现添加和删除QListWidget元素的槽:

void MainWindow::eraseItem()
{
// If multiple selection is on, we need to erase all selected items
for (int i = 0; i < listWidget->selectedItems().size(); ++i) {
// Get curent item on selected row
QListWidgetItem *item = listWidget->takeItem(listWidget->currentRow());
// And remove it
delete item;
}
}

如您所见,我们迭代所有选定的项目(设置多选模式使用 setSelectionMode() 方法)并自行删除它,因为 docs这么说

Items removed from a list widget will not be managed by Qt, and will need to be deleted manually.

添加一些项目更容易,我为不同项目标题使用静态变量的解决方案如下所示:

void MainWindow::addItem()
{
static int i = 0;
listWidget->addItem(QString::number(++i));
}

为了简化您的代码,请使用 Qt5 sytax用于信号和插槽。它消除了创建中间槽的需要。

希望对你有帮助。

关于c++ - Qt 右键单击​​ QListWidget 打开上下文菜单并删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31383519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com