QTableWidgetItem 文本已更改

QTableWidgetItem text changed

本文关键字:文本 QTableWidgetItem      更新时间:2023-10-16

我正在寻找一种干净的方式来在QTableWidgetItem更改其文本时对事件做出反应。我尝试使用信号QTableWidget::itemChanged(QTableWidgetItem *item)但这会导致错误,因为我更改了插槽中QTableWidgetItem的背景颜色,然后递归执行此插槽,因为 itemChanged。

我也尝试使用信号QTableWidget::itemEntered(QTableWidgetItem *item)但这与一些对我不起作用的鼠标事件有关。

我尝试的最后一种方法是覆盖我的自定义 QTableWidget 类中的事件过滤器,如下所示:

bool custom_DropTable::eventFilter(QObject *obj, QEvent *evt)
{
if (evt->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(evt);
if (keyEvent->key() == Qt::Key_Return)
{
emit si_itemTextEntered(this->currentItem());
return true;
}
else
{
return false;
}
}
else
{
return QObject::eventFilter(obj, evt);
}
}

但是即使按回车键,信号也永远不会真正到达,因此请设置文本。

有人对我有什么建议或改进吗?

您可以使用QObject::blockSignals将小部件设置为"否"以发送信号。这样,您可以使用连接到插槽的信号QTableWidget::itemChanged(QTableWidgetItem* item),该插槽将首先阻止桌子的信号,然后更改项目,然后取消阻止信号。这里有一个最小的例子:

#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
// Declare table globaly so the slot can block its signals
QTableWidget* table;
// Slot
void itemChanged(QTableWidgetItem* item)
{
// Block table signals
table->blockSignals(true);
// Change item background color
item->setBackgroundColor(Qt::red);
// Append text
item->setText(item->text() + " edited");
// Unblock signals
table->blockSignals(false);
}
int main(int argc, char** argv)
{
// Create application
QApplication app(argc, argv);
// Create table
table = new QTableWidget(3, 4);
// Add items
for (int i = 0; i < table->rowCount() * table->columnCount(); i++)
{
int row = i / table->columnCount();
int col = i % table->columnCount();
table->setItem(row, col, new QTableWidgetItem(QString::number(i)));
}
// Connect
QObject::connect(table, &QTableWidget::itemChanged, itemChanged);
// Show table
table->show();
// Run
return app.exec();
}