2015-07-13 13 views
9

Voglio sapere come posso aprire un menu popup quando faccio clic con il pulsante destro del mouse sugli elementi della tabella. Nel menu a comparsa devono essere fornite alcune azioni come aggiungere ed eliminare che creeranno una nuova riga o elimineranno la riga selezionata.Qt RightClick on QListWidget Apre il menu contestuale e elimina l'elemento

Sono un nuovo nel QT World, quindi se qualcuno può darmi i dettagli completi (con il codice, se possibile), allora sarò davvero grato a lui/lei.

Grazie.

Il mio obiettivo: Solo nella zona di QListWidget e solo se si fa clic su un elemento, si apre il menu con Elimina.


Edit: Ok posso risolvere il problema con il QListWidget e il menu. Tuttavia, solo ora è necessario raggiungere quanto segue:

Se si fa clic sull'elemento con il pulsante destro del mouse, quindi su Elimina, l'elemento verrà eliminato.

My Code:


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: Ok ho risolto il problema del foro: D. Ho caricato il mio codice se qualcuno ha bisogno di qualcosa del genere per poterlo aiutare.

+0

leggere la mia risposta per correttamente utilizzando 'takeItem()' metodo –

+0

fresco, funziona davvero – ejectamenta

risposta

15

primo luogo è necessario creare slot per menu contestuale apertura:

void showContextMenu(const QPoint&); 

Alla costruzione della classe, che ha usato QListWidget, set context menu policy al costume e collegare QListWidget::customContextMenuRequested(QPoint) del segnale e showContextMenu() fessura in questo modo:

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

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

Quindi occorre aprire il menu contestuale:

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); 
} 

Dopo questo abbiamo bisogno di realizzare gli slot per l'aggiunta e la rimozione di QListWidget elementi:

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; 
    } 
} 

Come si può vedere iteriamo tutti gli elementi selezionati (per la modalità impostata selezione multipla uso setSelectionMode() metodo) ed eliminarlo da noi stessi, perché docs dice che

elementi rimossi da un widget elenco non saranno gestiti da Qt, e sarà devono essere eliminati manualmente.

Aggiunta di alcuni elementi è più facile, la mia soluzione con variabile statica per diverso elemento caption assomiglia:

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

Per semplificare l'utilizzo del codice Qt5 sytax per i segnali e gli slot. Elimina la necessità di creare slot intermedi.

Spero che ti sia d'aiuto.

+0

invece 'delete' dovrebbe usare' deleteLater() 'chiamata' QObject' – Dcow

+0

Grazie per l'aiuto questo è grande: D. – SDE

+0

@Dcow 'QListWidgetItem' non ereditato' QObject' –

Problemi correlati