简体   繁体   English

QTableWidgetItem文本已更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM