gpt4 book ai didi

c++ - QListWidget::itemChanged 信号在 qt 中触发了两次

转载 作者:行者123 更新时间:2023-11-30 05:05:21 33 4
gpt4 key购买 nike

我有一个 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

如果我只想在输入新名称并按下回车键时触发一次信号怎么办,我应该怎么做才能实现这一目标?
谢谢

最佳答案

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

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

插槽是这样的:

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

信号将在编辑结束时发出(即按下回车键或失去焦点等)

关于c++ - QListWidget::itemChanged 信号在 qt 中触发了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423343/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com