Qt RightClick on QListWidget打开Contextmenu和Delete Item

SDE*_*SDE 12 c++ qt

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

我是Qt世界的新手,所以如果有人能给我详细信息(如果可能的话还有代码),那么我将非常感激他/她.

谢谢.

我的目标:只有在QListWidget您点击某个项目的区域内,才会打开包含删除的菜单.


编辑:好的我用QListWidget和菜单解决了问题.现在必须完成以下工作:

如果使用鼠标右键单击某个项目,然后单击"删除",则该项目将被删除.

我的代码:


void ProvideContextMenu(const QPoint &); // MainWindow.h
Run Code Online (Sandbox Code Playgroud)
// 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:好的,我解决了整个问题:D.我上传了我的代码,如果有人需要这样的东西,它可以帮助他/她.

t3f*_*--i 21

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

void showContextMenu(const QPoint&);
Run Code Online (Sandbox Code Playgroud)

在您使用的类的构造函数中QListWidget,将上下文菜单策略设置为自定义并连接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)));
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

在此之后,我们需要实现添加和删除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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

从列表小部件中删除的项目将不由Qt管理,需要手动删除.

添加一些项目更容易,我的解决方案与不同项目标题的静态变量看起来像:

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

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

我希望它对你有所帮助.