2015-07-13 98 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' –

相關問題