QListWidget :: itemChanged信号在qt中触发两次

时间:2018-01-24 13:11:20

标签: c++ qt qlistwidget

我有QListWidget来存储用户名,我使用此信号来检测用户名是否被更改:

connect(listWidget, &QListWidget::itemChanged, this, &MainWindow::changeUserName);

void MainWindow::changeUserName(QListWidgetItem *editItem)
{
    qDebug() << "Name:" << editItem->text();
}

这就是我在另一个函数中使QListWidget可编辑的方式:

connect(listWidget, &QListWidget::itemDoubleClicked, this, &MainWindow::makeListEditable);

void MainWindow::makeListEditable()
{
    QListWidgetItem *editItem = listWidget->currentItem();
    editItem->setFlags(editItem->flags() | Qt::ItemIsEditable);
    qDebug() << "Name edit";
}

但令我困惑的是,每当我双击列表小部件时,itemChanged信号将被触发一次,当我输入新的用户名时,信号将再次被触发。为什么会这样?

这是调试输出,当我双击列表时,它说:

Name: "Testing name_1"
Name edit

在我输入新名称并点击输入后,它说:

Name: "Testing name_2" //a new name I changed to

如果我只想在输入新名称并点击输入时只触发一次信号,我该怎么办?
感谢

2 个答案:

答案 0 :(得分:1)

您可以使用项目委托commitData信号,这样:

QObject::connect(listWidget->itemDelegate(), SIGNAL(commitData(QWidget*)), this, SLOT(dataCommited(QWidget*)));

插槽是这样的:

void dataCommited(QWidget * w)
{
    QString data = (static_cast<QLineEdit *>(w))->text();
    //...
}

信号将在编辑结束时发出(即输入按键或焦点丢失等)

答案 1 :(得分:0)

正如@Rafalon所说,调用setFlags调用你的插槽changeUserName,当前项改变时发出信号 currentTextChanged ,它与 currentItemChanged 相同,除了它给出你是文本而不是项目。

您可以做的是,在实例化时让您的项目可编辑:

QListWidgetItem* pItem = new QListWidgetItem();
pItem->setText("Testing name_1");
pItem->setFlags(pItem->flags() | Qt::ItemIsEditable);
listWidget->addItem(pItem);

或者您可以在需要时激活/停用连接:

void MainWindow::makeListEditable(QListWidgetItem *editItem)
{
    editItem->setFlags(editItem->flags() | Qt::ItemIsEditable);
    connect(ui->listWidget, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(changeUserName(QListWidgetItem *)));
    qDebug() << "Name edit";
}
void MainWindow::changeUserName(QListWidgetItem *editItem)
{
    qDebug() << "Name:" << editItem->text();
    disconnect(ui->listWidget, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(changeUserName(QListWidgetItem *)));
}

但是当双击后未修改当前元素时,您可能需要建立另一个连接,可能是信号 currentItemChanged