QListWidget右键菜单

    关于QListWidget右菜单的的实现,网上多数资料都没有提到如何使用Qt Creator快速实现(如参考资料[1][2]),本文重点介绍此方法。

1 槽函数生成

    通过Qt Creator的UI设计器将QListWidget控件拖放到主界面中,然后右键单击QListWidget控件,在弹出的槽选择框中,选中customContextMenuRequested(Point)槽,然后确定:

QListWidget右键菜单_第1张图片

                                                                           图1

    若想通过右键单击QListWidget触发与customContexMenuRequsted()绑定的信号,还得设置QListWidget的MenuPolicy属性。有2种方法可以达到此目的。

方法一:

    选中QListWidget控件,然后在右侧的属性栏中修改contextMenuPolicy属性为CustomContextMenu,如下图所示:


                                                                       图1.2

方法二:

    在构建函数中添加如下设置代码:

ui->seedsListWidget->setContextMenuPolicy( Qt::CustomContextMenu );

    说明:(1) seedsListWidget是我对QListWidget控件的名字,实际使用时,根据实际的名字进行修改。

                (2) 两种方法,使用其一即可。本文推荐使用方法一。

2 槽函数完善

    本文要达到的效果是,为QListWidget控件添加2个右键菜单“Delete”和“Clear”,分别用于删除选中的项和清空QListWidget。

2.1 custumContextMenu槽函数

void SegmentationSetting3D::on_seedsListWidget_customContextMenuRequested(const QPoint &pos)
{
    QListWidgetItem* curItem = ui->seedsListWidget->itemAt( pos );
    if( curItem == NULL )
        return;

    QMenu *popMenu = new QMenu( this );
    QAction *deleteSeed = new QAction(tr("Delete"), this);
    QAction *clearSeeds = new QAction(tr("Clear"), this);
    popMenu->addAction( deleteSeed );
    popMenu->addAction( clearSeeds );
    connect( deleteSeed, SIGNAL(triggered() ), this, SLOT( deleteSeedSlot()) );
    connect( clearSeeds, SIGNAL(triggered() ), this, SLOT( clearSeedsSlot()) );
    popMenu->exec( QCursor::pos() );
    delete popMenu;
    delete deleteSeed;
    delete clearSeeds;
}

2.2 deleteSeedSlot()

void SegmentationSetting3D::deleteSeedSlot()
{
    int ch = QMessageBox::warning(NULL, "Warning",
                                  "Are you sure to delete seed ?",
                                  QMessageBox::Yes | QMessageBox::No,
                                  QMessageBox::No);

    if ( ch != QMessageBox::Yes )
        return;

    QListWidgetItem * item = ui->seedsListWidget->currentItem();
    if( item == NULL )
        return;

    int curIndex = ui->seedsListWidget->row(item);
    ui->seedsListWidget->takeItem(curIndex);
	delete item;
}
2.3 clearSeedsSlot()

void SegmentationSetting3D::clearSeedsSlot()
{
    int ch = QMessageBox::warning(NULL, "Warning",
                                  "Are you sure to clear seeds ?",
                                  QMessageBox::Yes | QMessageBox::No,
                                  QMessageBox::No);

    if ( ch != QMessageBox::Yes )
        return;

    QListWidgetItem * item = ui->seedsListWidget->currentItem();
    if( item == NULL )
        return;

    ui->seedsListWidget->clear();
}

参考资料

[1]QListWidget中右键单击Item出现菜单

[2]QListWidget的item上实现右键菜单

你可能感兴趣的:(Qt)