Проблема сравнения QTableWidgetItems с элементами QStringList

Я создаю QStringList из файла:

QFile myTextFile("/home/user/Desktop/file.txt");
QStringList myStringList;
if (!myTextFile.open(QIODevice::ReadOnly))
    {
        QMessageBox::information(0, "Error opening file", myTextFile.errorString());
    }
else
    {  
        while(!myTextFile.atEnd())
        {
            myStringList.append(myTextFile.readLine());
        }
        myTextFile.close();
    }

... создается и заполняется QTableWidget, затем я хочу отметить те элементы в строке 5, которые соответствуют одному из элементов в myStringList:

int rows = ui->tableWidget->rowCount();
for(int i = 0; i < rows; ++i)
{
    QString str1 = ui->tableWidget->item(i, 5)->text();
    if (myStringList->contains(str1))
    //if(ui->tableWidget->item(i, 5)->text() == "targetstring")
    {
        ui->tableWidget->item(i, 5)->setBackgroundColor(Qt::blue);
    }
}

Это компилируется, но segfaults при выполнении. Таблица существует и полностью заполнена на данный момент. Если я явно передаю целевую строку (строка закомментирована), она работает нормально, но мне нужно проверить ее по StringList.

Любые предложения приветствуются, сводили меня с ума!


person user3891489    schedule 22.06.2015    source источник
comment
Вы звонили QTableWidget::setItem по каждому пункту? Что выводит qDebug() << ui->tableWidget->item(i, 5)?   -  person Amartel    schedule 22.06.2015
comment
Да, все ячейки были установлены с помощью setItem. Элементы, созданные с помощью QTableWidgetItem *abcItem = new QTableWidgetItem(QString::fromStdString(abc.ToString())); .qDebug не работает, но QTextStream(stdout) ‹‹ ui-›tableWidget-›item(i, 5); дает мне много шестнадцатеричной тарабарщины. Однако содержимое файла отображается правильно, когда я вставляю QString listitems = myStringList.join(,) во всплывающем окне сообщения.   -  person user3891489    schedule 22.06.2015
comment
В последнем фрагменте кода вы написали myStringList->. Это ошибка копирования-вставки или myStringList указатель? Это действительно?   -  person Amartel    schedule 22.06.2015
comment
Это был указатель, поскольку myStringList был создан в другом месте. Я решил эту проблему, поместив код StringList в ту же функцию, что и код сравнения, и удалив указатели на переменные. Мне также пришлось добавить проверку «if (rows ›1)» перед циклом итерации строк, так как, несмотря на то, что таблица была полностью заполнена на экране передо мной, каким-то образом цикл поиска выполнялся раньше, чем то, что явно все еще делал tablewidget. . Спасибо за подсказку! О, и пришлось 'QString listitems = myStringList.join();' и запустите проверку, не удалось заставить его работать со списком строк.   -  person user3891489    schedule 22.06.2015


Ответы (1)


Вы сказали:

I then want to mark those items in row 5

но в коде вы установили 5 столбцов:

QString str1 = ui->tableWidget->item(i, 5 <- here)->text();
QTableWidgetItem *  item(int row, int column) const

Я думаю, что у вас есть только один столбец, в любом случае проверьте размер вашей таблицы (выведите количество строк и столбцов выходной таблицы и проверьте его, потому что ваш код выглядит действительно небезопасным даже для прототипа).

person UndeadDragon    schedule 22.06.2015
comment
Извините, я имел в виду колонку! Я определенно ориентируюсь на правую колонку. - person user3891489; 22.06.2015
comment
Можете ли вы дать мне, что qDebug() выводит на qDebug() ‹‹ ui-›tableWidget-›rowCount() ‹‹ ui-›tableWidget-›columnCount()? и содержимое файла, возможно. - person UndeadDragon; 22.06.2015