Ответ 1
Во-первых, вам нужно создать слот для открытия контекстного меню:
void showContextMenu(const QPoint&);
В конструкторе вашего класса, который использовал QListWidget
, установить политику контекстного меню для настройки и подключения сигнала 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 для сигналов и слотов. Это устраняет необходимость создания промежуточных слотов.
Я надеюсь, что это поможет вам.