【问题标题】:QTableWidget omits some itmes, items are created but ignoredQTableWidget 省略了一些项目,项目被创建但被忽略
【发布时间】:2019-10-06 10:49:42
【问题描述】:

我有两个不同的项目,我使用 QTableWidget 对象,我在这两个项目中都有同样的问题。 我尝试用new QTableWidgetItem 填充QTableWidget 对象,但有些项目丢失了,它们没有在表中表示。 MinGW 和 MSVC 编译器会出现问题。 我已经尝试过 5.12.1 和 5.12.5 Qt 版本。 请帮我弄清楚它有什么问题。

我使用非常简单的代码,如下所示 在一个项目中,如果我连续两次调用createItems(),则表格已填满 但是另一个项目使用更大的表,所以如果我多次调用它,这段代码就可以工作,但无论如何都不是完全的

void MainWindow::createItems()
{
    for (int r = 0; r < ui->tableWidget->rowCount(); ++r)
    {
        for (int c = 0; c < ui->tableWidget->columnCount(); ++c)
        {
            QTableWidgetItem *pi = ui->tableWidget->item(r, c);
            if (pi != nullptr) continue;
            pi = new QTableWidgetItem();
            ui->tableWidget->setItem(r, c, pi);
            qDebug() << r << c << pi << ui->tableWidget->item(r, c)
                     << (pi == ui->tableWidget->item(r, c));
        }
    }
}

它是 qDebug 输出的一部分

0 0 0x2c4af2f0 0x2c4af2f0 true
0 1 0x2c4af970 0x2c4af970 true
0 2 0x2c4af9b0 0x2c4af9b0 true
0 3 0x2c4afa70 0x2c4afa70 true
0 4 0x2c4aeb30 0x2c4aeb30 true
0 5 0x2c4aecb0 0x2c4aecb0 true
1 0 0x2c4aed30 0x2c4aed30 true
1 1 0x2c4aedf0 0x2c4aedf0 true
1 2 0x2c4aee30 0x2c4af9b0 false
2 0 0x2c4afdf0 0x2c4afdf0 true
2 1 0x2c4aeef0 0x2c4aeef0 true
2 2 0x2c4aef30 0x2c4af9b0 false

请注意(1, 2) and (0, 2) and (2, 2),为什么会这样?

然后我像下面这样循环填充项目。并非所有项目都被创建时代码崩溃,很明显项目指针为空但我确定它已被创建

for (int r = 0; r < rows_amount; ++r)
{
    ui->tableWidget->item(r, 0)->setData(Qt::DisplayRole, r);
    ui->tableWidget->item(r, 1)->setData(Qt::DisplayRole, r+1);
}

在第二个项目中,我在通过“new”命令创建项目时填充项目,然后我调用类似pTable-&gt;setItem(r, c, pItem)

在使用setItem 的第二个项目中,表格看起来像this (my real example)

它在某些计算机上正常工作,代码很简单,所以我不知道我在做什么错

【问题讨论】:

    标签: c++ qt missing-data qtablewidget qtablewidgetitem


    【解决方案1】:

    似乎Item指针不为空! 你能检查它是否在 if 条件内吗?

    你可能应该删除它们并将它们归为那些情况。

    【讨论】:

    • 其实你是对的,"(pi != nullptr)" 条件对于某些项目是正确的,但无论如何我都很奇怪,表格是从头开始创建的,不应该有任何项目。我还尝试删除指针检查,这意味着无论如何都应该替换所有项目,但我再次看到它“1 2 0x2c546b80 0x2c546540 false”,一些指针具有相同的地址。我每次都在相同的单元格中看到它:(1, 2), (2, 2), (3, 2) 等等
    • 我相信 cpp 没有保证(尽管它取决于编译器)但大多数情况下你必须检查你创建的每个动态变量
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多