首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableWidgetItem文本已更改

QTableWidgetItem文本已更改
EN

Stack Overflow用户
提问于 2019-04-17 17:08:32
回答 1查看 3K关注 0票数 3

我正在寻找一种干净的方式来反应事件,如果一个QTableWidgetItem已经改变了它的文本。我试图使用信号QTableWidget::itemChanged(QTableWidgetItem *item),但这导致了一个错误,因为我在我的插槽中更改了QTableWidgetItem的背景颜色,然后这个插槽被递归地执行,因为itemChanged。

我也尝试过使用信号QTableWidget::itemEntered(QTableWidgetItem *item),但这与一些鼠标事件有关,这对我并不起作用。

我尝试的最后一个方法是覆盖我的自定义QTableWidget类中的eventfilter,如下所示:

代码语言:javascript
复制
    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);
    }
}

但是,即使按回车键,信号也永远不会真正到达,因此请设置文本。

有人对我有什么建议或改进吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 18:07:38

您可以使用QObject::blockSignals将您的小部件设置为no以发送信号。这样,您可以使用连接到插槽的信号QTableWidget::itemChanged(QTableWidgetItem* item),该插槽将首先阻止表中的信号,然后更改项目,然后取消阻止信号。这里有一个最小的示例:

代码语言:javascript
复制
#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();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55723887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档