【问题标题】:disable editing and setItem to several rows in QTableWidget对 QTableWidget 中的几行禁用编辑和 setItem
【发布时间】:2016-07-10 20:10:41
【问题描述】:

| Name | Math | Physics | Average grade |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |

  1. “math”和“physics”栏是供用户输入数字的,“average”栏不能输入数值,仅用于显示用户输入“math”和“physics”后的平均值“ 年级。如何禁用编辑但仍在“平均”列中显示计算值?

  2. 我想将内容写入多行,但我的代码不起作用

    ui->tableWidget->setColumnCount(4);
    ui->tableWidget->setRowCount(8);
    ui->tableWidget->setSortingEnabled(false);
    QTableWidgetItem *newItem = new QTableWidgetItem(tr("Hello World"));
    for (int i=0; i< ui->tableWidget->rowCount(); i++)
        ui->tableWidget->setItem(i, 0, newItem);
    

有这样一条消息

QTableWidget: cannot insert an item that is already owned by another QTableWidget

我还是不明白,因为我是 QT 的新手。请帮助我,非常感谢! :)

代码更新:

for (int i = 0; i < ui.tableWidget->rowCount(); i++) {
    QTableWidgetItem *icon_item = new QTableWidgetItem;
    QIcon icon(":/myproject/icon/test.png");
    icon_item->setIcon(icon);
    ui.tableWidget->setItem(i, 0, icon_item);
}

for (int j = 0; j < ui.tableWidget->rowCount(); j++) {
    ui.tableWidget->item(j, 3)->setFlags(ui.tableWidget->item(j, 3)->flags() & ~Qt::ItemIsEditable);
}

【问题讨论】:

    标签: qt qtableview qtablewidget


    【解决方案1】:
    1. 您可以使用QTableWidgetItem::setFlags()。保留其他默认标志,但删除Qt::ItemIsEditable:

      item->setFlags(item->flags() & ~Qt::ItemIsEditable);
      
    2. 您不能将相同的QTableWidgetItem 实例设置为多个单元格。为了让您开始:

      for (...) {
          QTableWidgetItem *item = new QTableWidgetItem(...);
          tableWidget->setItem(...);
      }
      

    【讨论】:

    • 非常感谢。您的第二个解决方案对我来说效果很好。但是,第一个不起作用,因为我有访问冲突。我的代码是for (int i=0; i&lt;ui.tablewidget-&gt;rowCount(); i++) { ui.tablewidget-&gt;item(i,3)-&gt;setFlags(ui.tablewidget-&gt;item(i,3)-&gt;flags() &amp; ~Qt::ItemIsEditable); },当我调试时,当我运行到4时,我有访问冲突:(
    • 那么您可能正在取消引用空指针,因为没有为该单元格/列调用 setItem()。
    • 那么我应该怎么做才能避免这个问题呢? (对不起,我是新手)
    • 没有看到代码,我只能猜测您可能为每一行创建了一个项目,并调用了ui.tablewidget-&gt;setItem(i, 0, someItem);,但忘记为其他列创建项目并调用ui.tablewidget-&gt;setItem(i, 3, otherItem);,为例子。
    • 哎呀,你是对的。我在上面的问题中更新了我的代码。实际上我想在第 0 列的名称旁边创建一个小图标,所以我只在第 0 列中插入图标​​。第 1 列和第 2 列不应包含图标,它应该仅用于价值,因此我没有为此创建任何项目。第 3 列仅用于显示,所以我按照您的建议进行编码。那么如何改进我的代码以避免指针问题?
    猜你喜欢
    • 2019-01-12
    • 2018-08-02
    • 1970-01-01
    • 2023-04-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多