Listwidget中的右键

时间:2015-12-03 14:12:13

标签: c++ qt pointers

我有一种方法可以删除QListWidget上的文件列表:

void MainWindow::ProvideContextMenu(const QPoint &pos) 
{
    QPoint item = ui->listWidget->mapToGlobal(pos);
    QMenu submenu;
    submenu.addAction("Delete");
    QAction* RightClick = submenu.exec(item);

    if(RightClick->text().contains("Delete"))
    {
        qDeleteAll(ui->listWidget->selectedItems());
    }
}

enter image description here

我有两个问题:

  1. 右键单击并显示删除按钮后,如果单击删除以外的任何其他位置,整个程序将关闭。不知道为什么。

  2. 正如您在图片中看到的那样,我没有选择文件,我只需右键单击"在文件"上。显然,这并不是选择的。所以每次我必须删除,首先我必须选择一个文件,然后右键单击。有没有办法解决这个问题?

  3. 编辑1:仍未找到第二个问题的解决方案。

1 个答案:

答案 0 :(得分:3)

    如果未选择任何操作,则
  1. QMenu::exec会返回nullptr。您之后取消引用空指针 - RightClick->text()并且您的程序崩溃了。你必须避免这种情况。

  2. QListWidget::selectedItems返回临时QList(副本),您不会通过操纵来更改窗口小部件的状态。使用QListWidget的成员函数删除其项目。

  3. 最终代码是:

    if(RightClick && RightClick->text() == "Delete")
    {
        for(auto item : ui->listWidget->selectedItems())
            delete ui->listWidget->takeItem(ui->listWidget->row(item));
    }
    

    编辑:实际上,我在第二段中回答的内容不是必需的,而且你所拥有的是正确的。此时,我不知道为什么列表项没有被选中。