QT:无法为listboxwidget中的列表框项添加选择和取消选择功能

时间:2017-03-14 02:00:08

标签: c++ qt listbox listboxitem

我正在使用QT和QT Creator并使用它进行编译(用于Windows的mingw编译器)。我正在尝试使用一些基于鼠标的函数创建一个列表框。我已经能够为它添加一个上下文菜单。其次,当我右键单击上下文菜单时,列表框项目会被选中。第三,即使我左键单击该项目,该项目也会被选中。我想要做的是如果选择了一个项目并再次点击它,它应该取消选择列表菜单中的项目。问题是如果我编写自己的代码,它会禁用默认操作,if语句会锁定窗口并导致窗口崩溃。我需要做什么来处理选择和取消选择方法?好像我做错了什么。这是我的代码。欢迎任何帮助。

#include "historicalrequests.h"
#include "ui_historicalrequests.h"
#include "customlistitemdelegate.h"

HistoricalRequests::HistoricalRequests(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::HistoricalRequests)
{
    ui->setupUi(this);
    ui->historicalRequestsWidget->setItemDelegate(new CustomListItemDelegate(ui->historicalRequestsWidget));
    QListWidgetItem *item = new QListWidgetItem();
    item->setData(Qt::DisplayRole, "Title");
    item->setData(Qt::UserRole + 1, "21/05/2017 12:12:456");
    ui->historicalRequestsWidget->addItem(item);
    QListWidgetItem *item2 = new QListWidgetItem();
    item2->setData(Qt::DisplayRole, "Workspace");
    item2->setData(Qt::UserRole + 1, "Description");
    ui->historicalRequestsWidget->addItem(item2);
    ui->historicalRequestsWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->historicalRequestsWidget, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested(QPoint)));
}

HistoricalRequests::~HistoricalRequests()
{
    delete ui;
}

void HistoricalRequests::customMenuRequested(QPoint pos){

    // My customContextMenu click functions here

}



void HistoricalRequests::on_historicalRequestsWidget_clicked(const QModelIndex &index)
{
if(ui->historicalRequestsWidget->item(index.row())){
    if((ui->historicalRequestsWidget->currentItem() == ui->historicalRequestsWidget->item(index.row()))){
        qWarning("Same item" );
    } else {
        qWarning("Different item");
        //ui->historicalRequestsWidget->item(index.row())->setSelected(true);
    }
} else {
    // some code here
}
}

1 个答案:

答案 0 :(得分:1)

据我所知,您需要做的就是将SelectionMode设置为MultiSelection:

ui->listWidget->setSelectionMode(QAbstractItemView::MultiSelection);

如果您一次只需要选择一个项目,则可以在连接到QSelectionModel :: selectionChanged信号的插槽中处理它。在那里,您可以使用selectionModel-> select()方法取消选择上一项。

相关问题