如果QTableWidgetItem
改变了它的文本,我正在寻找一种干净的方式来对事件做出反应。我曾尝试使用Signal QTableWidget::itemChanged(QTableWidgetItem *item)
,但这会导致错误,因为我更改了插槽中QTableWidgetItem
的backgroundcolor,然后这个插槽被递归执行,因为itemChanged。
我也尝试使用信号QTableWidget::itemEntered(QTableWidgetItem *item)
but这与一些对我不起作用的鼠标事件有关。
我试过的最后一个方法是覆盖我的自定义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);
}
}
但即使按下输入,信号也永远不会到达所以设置文本。
有人对我有任何建议或改进吗?
您可以使用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();
}