QTableWidget пропускает некоторые элементы, элементы создаются, но игнорируются

У меня есть два разных проекта, в которых я использую объект QTableWidget, и у меня одна и та же проблема в обоих. Я пытаюсь заполнить объект QTableWidget new QTableWidgetItem, но некоторые элементы пропущены, они не представлены в таблице. Проблема возникает с компиляторами 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) и (0, 2) и (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);
}

во втором проекте я заполняю элементы, когда они создаются командой «новая», затем я вызываю что-то вроде pTable->setItem(r, c, pItem)

Во втором проекте, где используется setItem, таблица выглядит так: это (мой реальный пример)

На некоторых компьютерах он работает нормально, а код прост, поэтому я понятия не имею, что делаю не так.


person Mikhail Z    schedule 06.10.2019    source источник


Ответы (1)


Кажется, что указатель Item не нулевой! Можете ли вы проверить, входит ли оно в условие if?

Вероятно, вам следует удалить и обнулить их в этих случаях.

person Mahi    schedule 06.10.2019
comment
На самом деле вы правы и условие (pi != nullptr) верно для некоторых элементов, но мне все равно странно, таблица создается с нуля и в ней не должно быть никакого элемента. Также пробовал убрать проверку указателей, а это значит, что все элементы должны быть заменены в любом случае, НО я снова вижу 1 2 0x2c546b80 0x2c546540 false, некоторые указатели имеют один и тот же адрес. Я вижу это каждый раз в одних и тех же ячейках: (1, 2), (2, 2), (3, 2) и так далее - person Mikhail Z; 06.10.2019
comment
Я считаю, что в cpp нет гарантии (хотя это зависит от компилятора), но в основном вам нужно проверять каждую созданную вами динамическую переменную. - person Mahi; 16.10.2019