我正在使用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
}
}
答案 0 :(得分:1)
据我所知,您需要做的就是将SelectionMode设置为MultiSelection:
ui->listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
如果您一次只需要选择一个项目,则可以在连接到QSelectionModel :: selectionChanged信号的插槽中处理它。在那里,您可以使用selectionModel-> select()方法取消选择上一项。