listwidget右键菜单时不选中item

为实现的效果如题:

代码:
connect(ui->listWidget_2,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listwidget_2_itemclicked_slot(QListWidgetItem*)));

connect(ui->listWidget_2,SIGNAL(itemPressed(QListWidgetItem*)),this,SLOT(ceshi(QListWidgetItem*)));

void mainwindow::ceshi(QListWidgetItem* item)
{
qDebug()<<lastitem->text();
if(item!=lastitem)
{

lastitem->setSelected(true); //这句代码的意思是:通常itempress信号会导致鼠标位置的item被选中,在这里把它给变回去原来的那个item,这样视觉上原来的item还是选中的;
}

}

void mainwindow::listwidget_2_itemclicked_slot(QListWidgetItem *item)
{

item->setSelected(true);
lastitem=item;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Qt中的TableWidget右键菜单筛选功能,可以按照以下步骤进行: 1. 添加右键菜单 在TableWidget的构造函数中,添加以下代码: ```cpp setContextMenuPolicy(Qt::CustomContextMenu); //开启右键菜单策略 connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(slotContextMenu(const QPoint&))); //连接信号和槽函数 ``` 然后实现槽函数`slotContextMenu`: ```cpp void TableWidget::slotContextMenu(const QPoint& pos) { QMenu *menu = new QMenu(this); QAction *filterAction = new QAction("Filter", this); connect(filterAction, SIGNAL(triggered()), this, SLOT(slotFilter())); menu->addAction(filterAction); menu->exec(QCursor::pos()); //菜单显示的位置 } ``` 这里添加了一个`Filter`的菜单项,并连接了一个`slotFilter`函数。 2. 实现代理 在TableWidget中,为需要筛选的列设置代理,重写`createEditor`函数,将自定义的代理与该列绑定: ```cpp void TableWidget::setColumnFilter(int column, QAbstractItemDelegate *delegate) { setItemDelegateForColumn(column, delegate); } QWidget* TableWidget::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == filterColumn) //filterColumn为需要筛选的列的列号 { return itemDelegate(index)->createEditor(parent, option, index); } else { return QTableWidget::createEditor(parent, option, index); } } ``` 这里需要自定义一个代理类,重写以下函数: ```cpp QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QComboBox *editor = new QComboBox(parent); QStringList options; options << "Option1" << "Option2" << "Option3"; //筛选条件列表 editor->addItems(options); return editor; } void setEditorData(QWidget *editor, const QModelIndex &index) const override { QString value = index.model()->data(index, Qt::EditRole).toString(); QComboBox *comboBox = static_cast<QComboBox*>(editor); comboBox->setCurrentText(value); } void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override { QComboBox *comboBox = static_cast<QComboBox*>(editor); QString value = comboBox->currentText(); model->setData(index, value, Qt::EditRole); } void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override { editor->setGeometry(option.rect); } ``` 这里的代理是一个带有下拉框的QComboBox,用于选择筛选条件。 3. 实现筛选 在`slotFilter`函数中,获取当前选中的行和列,然后获取该单元格的代理,从而得到当前的筛选条件,使用`setRowHidden`函数隐藏不符合条件的行: ```cpp void TableWidget::slotFilter() { int row = currentRow(); int column = currentColumn(); QAbstractItemDelegate *delegate = itemDelegateForColumn(column); if (delegate) { QComboBox *comboBox = dynamic_cast<QComboBox*>(delegate->createEditor(this, QStyleOptionViewItem(), QModelIndex())); if (comboBox) { QString filter = comboBox->currentText(); for (int i = 0; i < rowCount(); i++) { if (i != row) { QString value = item(i, column)->text(); if (value != filter) { setRowHidden(i, true); } else { setRowHidden(i, false); } } } } } } ``` 这里的`setRowHidden`函数可以隐藏或显示某一行。 以上就是实现TableWidget右键菜单筛选功能的步骤,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值