Текст QTableWidgetItem изменен - PullRequest
       2

Текст QTableWidgetItem изменен

0 голосов
/ 17 апреля 2019

Я ищу чистый способ реагировать на событие, если 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);
    }
}

Но сигнал на самом деле никогда не приходит, даже если нажать enter, поэтому установите текст.

Есть ли у кого-нибудь какие-либо предложения или улучшения для меня?

1 Ответ

1 голос
/ 17 апреля 2019

Вы можете отключить виджет для отправки сигналов, используя 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...