【问题标题】:QListWidget::itemChanged signal triggered twice in qtQListWidget::itemChanged 信号在 qt 中触发了两次
【发布时间】:2018-01-24 13:11:19
【问题描述】:

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

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

【问题讨论】:

  • @eyllanesc 好的,我编辑它。
  • 嗯,当你双击时,你改变你的项目的标志,所以这个项目在某种程度上改变了,对吧?您可能正在寻找看起来更像 itemTextChanged 的东西(虽然不确定这个是否存在)。快速浏览后,有 currentTextChanged 信号——doc.qt.io/archives/qt-4.8/qlistwidget.html#currentTextChanged
  • @Rafalon 是的,itemTextChanged 信号是我正在寻找的,但它不存在。我想要实现的是检测项目的文本是否已更改。不幸的是,我不知道该怎么做。
  • 这不是 currentTextChanged 你在找什么吗?

标签: c++ qt qlistwidget


【解决方案1】:

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

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

槽是这样的:

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

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

【讨论】:

    【解决方案2】:

    正如@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      相关资源
      最近更新 更多