Russian Qt Forum

Qt => Общие вопросы => Тема начата: 1Skazochnik от Январь 26, 2011, 13:17



Название: Удаление пустых столбцов в таблице.
Отправлено: 1Skazochnik от Январь 26, 2011, 13:17
Добрый день ! Я еще только учусь Qt, пишу программу, которая читает файл с запятыми в качестве разделителей и помещает это все в таблицу. Принцип действия(можете посоветовать более оптимальный):
1. Открываю файл, считываю в строку content.
2. Разбиваю строку в StringList(команда QString::split), в качестве символа разбивки выбираю "\n". Теперь я имею массив из строк.
3. Далее получаю таким же образом массив из полей, символ разбивки - это запятая. Получаю массив из полей.
4. Далее избавляюсь от кавычек в каждом поле, использую QStringList::replaceInStrings("\"","\0");
5. Затем заношу так данные, используя цикл:
Код:
tmp = slFields.at(j); // берем поле по счету j, tmp это QString

        QTableWidgetItem *item = new QTableWidgetItem(tmp); // создаю item
        table->setItem(i, j, item); // заношу в таблицу i-строка, j-столбец. Перебираю строки, проходя по каждому элементу строки

Сделал CheckBox, по которому должны удаляться пустые столбцы, вот функция:
Код:
void CsvCon::on_delEmptyColsCheckBox_clicked()
{
    if (!content.isEmpty()) { // смотрю, если мы открывали файл то строка не пуста, поэтому продолжаем
        if (ui->delEmptyColsCheckBox->isChecked())  {
            delEmptyCols(ui->csvTable); // если флажек выбран, передаем управление функции, которая должна удалить
        } else {                        // пустые столбцы
            csvLoad(content, ui->csvTable); // если флажек не выбран, передаю функции строку и таблицу,
        }                                   // заносит все заново, как при открытии файла
    }
}
void CsvCon::delEmptyCols(QTableWidget *table) // а это функция для удаления
{
        bool del = true;                        // по умолчанию столбец надо удалить
        for (int i = 0; i < (table->columnCount()); i++) { // прохожу по столбцам
            for (int j = 0; j < (table->rowCount()); j++) { // цикл прохода по строкам
                    if (!(table->item(j, i)->text()).isEmpty()) // если хотя бы одна строка не пуста,
                        del = false;                // то збрасываем признак удаления
                 }
                if (del == true) table->removeColumn(i); // вконце цикла столбцов смотрим признак удаления, удаляем столбец
                del = true; // возвращаем признак удаления и переходим к следующему столбцу
}
}

На деле же выходит так: часть столбцов удалилась, часть нет. Если например взять 4 пустых столбцов, идущих друг за другом то удалятся 1 и 3.
Помогите пожалуйста, с утра ничего не получается.


Название: Re: Удаление пустых столбцов в таблице.
Отправлено: shirushizo от Январь 26, 2011, 20:31
...
На деле же выходит так: часть столбцов удалилась, часть нет. Если например взять 4 пустых столбцов, идущих друг за другом то удалятся 1 и 3.
Помогите пожалуйста, с утра ничего не получается.
Если у тебя столбцы 1,2,3 - пустые, то твой алгоритм работает так:
i=0. Проверяем столбец 0 - все ок
i=1. Проверяем столбец 1 - он пустой, след - удаляем. Столбец, который изначально был 2 становиться столбцом 1
i=2. Проверяем столбец 2 (который изначально был 3) - удаляем
...
Поэтому у тебя удалились не все столбцы. Решение:
Код:
if (del == true) 
{
  table->removeColumn(i);
  i--;
}


Название: Re: Удаление пустых столбцов в таблице.
Отправлено: 1Skazochnik от Январь 27, 2011, 11:50
Спасибо, разобрался. Теперь не удаляет только последнюю колонку, в ней почему-то даже после очищения что то находится, не пробел. Буду думать.


Название: Re: Удаление пустых столбцов в таблице.
Отправлено: 1Skazochnik от Январь 27, 2011, 12:01
В конце строки оказался символ "Возврат каретки - \r"