Russian Qt Forum
Ноябрь 24, 2024, 09:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление пустых столбцов в таблице.  (Прочитано 3852 раз)
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.
Помогите пожалуйста, с утра ничего не получается.
Записан
shirushizo
Гость
« Ответ #1 : Январь 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--;
}
Записан
1Skazochnik
Гость
« Ответ #2 : Январь 27, 2011, 11:50 »

Спасибо, разобрался. Теперь не удаляет только последнюю колонку, в ней почему-то даже после очищения что то находится, не пробел. Буду думать.
Записан
1Skazochnik
Гость
« Ответ #3 : Январь 27, 2011, 12:01 »

В конце строки оказался символ "Возврат каретки - \r"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 20.