添加时选择 QListWidgetItem

Selecting a QListWidgetItem when adding it

本文关键字:QListWidgetItem 选择 添加      更新时间:2023-10-16

我在表单中有一个QListWidgetQListWidgetItem显示">添加新"。当我点击它时,我希望发生一系列事情:

  1. QInputDialog::getText询问新项目的内容。
  2. 新项目将添加到具有给定文本的列表中。
  3. 列表将排序,但保留在末尾的">新增"除外(这是通过删除">添加新"项、排序并再次添加已删除的项目来完成的)。
  4. 新项目处于选中状态。

最后一部分是我遇到麻烦的部分。我尝试了许多不同的方法,都会导致相同的结果:我要选择的项目有一个虚线边框,它被理解为已选择(例如,通过ui->list->selectedItems()),但选择颜色保留在">添加新"之前的最后一个项目上。

我尝试了什么

  • item->setSelected(true);
  • ui->list->setCurrentItem(item);
  • ui->list->setCurrentRow(ui->list->row(item);

我注意到了什么

当调试器打开并带有缓慢完成这些步骤的断点时,我注意到一切似乎都运行良好,但在我调用的函数完成之前 UI 不会更新。

此外,当我想从另一个按钮单击调用的插槽中选择给定项目时,它可以与item->setSelected(true);(以及其他项目)正常工作。

我的猜测:我无法在添加它的同一功能中选择项目,因为我无法以图形方式选择尚不存在的内容。

关于如何实现这一目标的任何猜测?

注意

如果您遇到同样的问题,请阅读所选答案的评论,这实际上是一个信号问题!

您是否尝试选择添加的项目,然后将当前行设置为添加项目的行索引。这在我的示例中有效。

示例:主窗口.cpp

#include <QInputDialog>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->listWidget->addItem("Add New");
connect(ui->listWidget, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(slot_itemClicked(QListWidgetItem *)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slot_itemClicked(QListWidgetItem *item)
{
if (item && (item->text() == "Add New"))
{
QString text = QInputDialog::getText(this, "Input item text", "Text: ");
QListWidgetItem *newItem = new QListWidgetItem(text);
// Add new item and sort list
ui->listWidget->addItem(newItem);
ui->listWidget->sortItems();
// Move "Add New" item to list end
item = ui->listWidget->takeItem(ui->listWidget->row(item));
ui->listWidget->addItem(item);
// Select new item
// Set current row to index of new item row
newItem->setSelected(true);
ui->listWidget->setCurrentRow(ui->listWidget->row(newItem));
}
}

如果您可以从常规插槽中选择项目,则只需从非常短的计时器发出虚拟信号即可。喜欢这个

//add item
//...
QTimer::singleShot(1, this, SLOT(MySlotForSelectItem())); // 1 ms timer
MainWindow::MySlotForSelectItem()
{
//select item
}