[英]QTableWidgetItem text changed
Im looking for a clean way to react on the event if a QTableWidgetItem
has changed its text. 我正在寻找一种干净的方式来响应事件,如果
QTableWidgetItem
更改了其文本。 I´ve tried to use the Signal QTableWidget::itemChanged(QTableWidgetItem *item)
but this causes an error due to the fact that i change the backgroundcolor of the QTableWidgetItem
in my slot and this slot is then executed recursivly, because the itemChanged. 我尝试使用Signal
QTableWidget::itemChanged(QTableWidgetItem *item)
但这会导致错误,原因是我更改了插槽中QTableWidgetItem
的背景色,然后又递归执行了该插槽,因为itemChanged。
I've also tried to use the signal QTableWidget::itemEntered(QTableWidgetItem *item)
but this is related to some mouse events which doesnt really work for me. 我也尝试过使用信号
QTableWidget::itemEntered(QTableWidgetItem *item)
但这与某些鼠标事件有关,这对我而言实际上并不起作用。
The last method I've tried is to override the eventfilter in my custom QTableWidget class like this: 我尝试过的最后一个方法是重写自定义QTableWidget类中的eventfilter,如下所示:
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);
}
}
But the signal is never really arrived even if pressed enter so set the text. 但是即使按回车键也不能真正到达信号,因此请设置文本。
Has someone any suggestions or improvements for me? 有人对我有任何建议或改进吗?
You can make your widget no to send signals using QObject::blockSignals
. 您可以使用
QObject::blockSignals
将小部件设置为否以发送信号。 This way you can use the signal QTableWidget::itemChanged(QTableWidgetItem* item)
connected to an slot that will first block the signals of the table, then change the item, and then unblock the signals. 这样,您可以使用信号
QTableWidget::itemChanged(QTableWidgetItem* item)
连接到插槽,该插槽将首先阻止表格的信号,然后更改该项目,然后取消阻止信号。 Here you have a minimum example: 这里有一个最小的例子:
#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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.