我有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
如果我只想在输入新名称并点击输入时只触发一次信号,我该怎么办?
感谢
答案 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 。