QTableWidgetItem文本已更改

问题描述 投票:0回答:1

如果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);
    }
}

但即使按下输入,信号也永远不会到达所以设置文本。

有人对我有任何建议或改进吗?

c++ qt
1个回答
1
投票

您可以使用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();
}
© www.soinside.com 2019 - 2024. All rights reserved.