2015-07-13 99 views
9

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

我是QT世界的新人,所以如果有人能给我全部细节(如果可能的话带代码),那么我会非常感激他/她。

谢谢。

我的目标:只在QListWidget的区域内且仅当您点击某个项目时,才会打开带有删除的菜单。


编辑:好的,我解决与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。如果有人需要提供帮助,我已经上传了我的代码。

+0

阅读我的答案正确使用'takeItem()'方法 –

+0

酷,还真管用 – ejectamenta

回答

15

首先,你需要创建一个开放上下文菜单插槽:

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

项目从列表中删除小部件不会使用Qt进行管理,并将 需要手动删除。

添加一些项目比较容易,我对不同的项标题静态变量的解决方案是这样的:

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

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

我希望它对你有帮助。

+0

代替'delete'应该使用'deleteLater()''上QObject' – Dcow

+0

谢谢呼叫您的帮助,这是巨大的:d。 – SDE

+0

@Dcow'QListWidgetItem'不会继承'QObject' –

相关问题