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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView в txt  (Прочитано 7288 раз)
phantom85
Гость
« : Февраль 26, 2017, 23:17 »

Всех приветствую, на форуме не нашел подобного вопроса, поэтому прошу помочи в новой теме. Есть база которую отображаю в QTableView, необходимо видимое содержимое сохранить в txt файле но что бы было вместе с рамкой.

пример:
 ------------------------
| test1 | test2 | test3 |
 ------------------------
|  205  |  345  | 162  |
 -----------------------
пример таблицы не удачный но я думаю понятно ))) Заранее благодарен.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Февраль 27, 2017, 08:23 »

Разделите на два этапа:
1. получение текста из всех ячеек таблицы
2. сохранение этих данных как ascii таблица (тут или сами придумайте, или поищите готовое решение)
Записан

ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Февраль 27, 2017, 08:30 »

Я так понимаю необходимо определить какой диапазон ячеек в настоящий момент отображается на экране?
Затем для сохранения в текстовый файла необходимо запросить в модели содержимое ячеек с помощью метода

Код:
view.model()->data( index ).value< QString >();

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

Код:
view.setSelection( rect, QItemSelectionModel::ClearAndSelect );
QModelIndexList indices_for_store = view.selectedIndexes();
Записан
phantom85
Гость
« Ответ #3 : Февраль 27, 2017, 09:14 »

пытаюсь реализовать вот таким образом, всё бы ничего но не знаю как сделать верхнюю и нижнюю черту
Код:
    QString textData;
    int rows = model->rowCount();
    int columns = model->columnCount();

    for (int i = 0; i < rows; i++) {

         textData += "| ";
        for (int j = 0; j < columns; j++) {

            textData += model->data(model->index(i,j)).toString();
            textData += " | ";
        }
        textData += "\n";
    }
      ui->textEdit->setText(textData);
    // .txt
    QFile txtFile("test.txt");
    if(txtFile.open(QIODevice::WriteOnly | QIODevice::Text)) {

        QTextStream out(&txtFile);
        out << textData.toLatin1();

        txtFile.close();
    }
Записан
phantom85
Гость
« Ответ #4 : Февраль 27, 2017, 14:42 »

Не ужели то никто не знает?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Февраль 27, 2017, 15:09 »

Не ужели то никто не знает?

Я как то интересовался этим для питона, вот код:
Код
Python
# source: http://stackoverflow.com/a/5910078/5909792
def ascii_table(rows):
   headers = rows[0]
   lens = list()
   for i in range(len(rows[0])):
       lens.append(len(max([x[i] for x in rows] + [headers[i]], key=lambda x: len(str(x)))))
 
   formats = list()
   hformats = list()
 
   for i in range(len(rows[0])):
       if isinstance(rows[0][i], int):
           formats.append("%%%dd" % lens[i])
       else:
           formats.append("%%-%ds" % lens[i])
       hformats.append("%%-%ds" % lens[i])
 
   pattern = " | ".join(formats)
   hpattern = " | ".join(hformats)
   separator = "-+-".join(['-' * n for n in lens])
 
   text_lines = [hpattern % tuple(headers), separator]
   for line in rows[1:]:
       text_lines.append(pattern % tuple(t for t in line))
 
   return '\n'.join(text_lines)
 

для
Код
Python
columns = ['id', 'url', 'name', 'short_name', 'birthday', 'job', 'department', 'photo', 'work_phone', 'mobile_phone', 'email']
rows = [['#1', 'http://amiller.example.com', 'Andrew Miller', 'amiller', '11 December', 'Testing Engineer', 'CD, Product Support Service', 'amiller.jpg', '', '', 'amiller@example.com'], ['#2', 'http://ataylor.example.com', 'Anthony Taylor', 'ataylor', '17 July', 'Software Engineer', 'CD, Product Support Service', 'ataylor.jpg', '', '', 'ataylor@example.com'], ['#3', 'http://dmoore.example.com', 'Daniel Moore', 'dmoore', '2 March', 'Testing Engineer', 'CD, Product Support Service', 'dmoore.jpg', '', '', 'dmoore@example.com'], ['#4', 'http://dsmith.example.com', 'David Smith', 'dsmith', '5 January', 'Testing Engineer', 'Processing Services Division', 'dsmith.jpg', '', '', 'dsmith@example.com'], ['#5', 'http://awilson.example.com', 'Alexander Wilson', 'awilson', '11 April', 'Software Engineer', 'CD, Product Support Service', 'awilson.jpg', '', '', 'awilson@example.com'], ['#6', 'http://asmith.example.com', 'Alexander Smith', 'asmith', '3 November', 'Testing Engineer', 'CD, Product Support Service', 'asmith.jpg', '', '', 'asmith@example.com'], ['#7', 'http://jdavis.example.com', 'Jayden Davis', 'jdavis', '10 April', 'Shift Engineer', 'BSD, Presale Solution Bureau', 'jdavis.jpg', '', '', 'jdavis@example.com'], ['#8', 'http://jdavis.example.com', 'Jacob Davis', 'jdavis', '5 July', 'Shift Engineer', 'DD, Technical Translation Bureau', 'jdavis.jpg', '', '', 'jdavis@example.com'], ['#9', 'http://ejones.example.com', 'Ethan Jones', 'ejones', '14 September', 'Software Engineer', 'BSD, Presale Solution Bureau', 'ejones.jpg', '', '', 'ejones@example.com'], ['#10', 'http://abrown.example.com', 'Angel Brown', 'abrown', '15 April', 'Testing Engineer', 'Processing Services Division', 'abrown.jpg', '', '', 'abrown@example.com'], ['#11', 'http://dwilliams.example.com', 'David Williams', 'dwilliams', '23 November', 'Application Developer', 'DD, Technical Translation Bureau', 'dwilliams.jpg', '', '', 'dwilliams@example.com'], ['#12', 'http://ddavis.example.com', 'Daniel Davis', 'ddavis', '5 September', 'Shift Engineer', 'DD, Technical Translation Bureau', 'ddavis.jpg', '', '', 'ddavis@example.com'], ['#13', 'http://ntaylor.example.com', 'Nathan Taylor', 'ntaylor', '16 February', 'Shift Engineer', 'BSD, Presale Solution Bureau', 'ntaylor.jpg', '', '', 'ntaylor@example.com'], ['#14', 'http://dtaylor.example.com', 'Daniel Taylor', 'dtaylor', '10 March', 'Application Developer', 'DD, Technical Translation Bureau', 'dtaylor.jpg', '', '', 'dtaylor@example.com'], ['#15', 'http://jbrown.example.com', 'Jayden Brown', 'jbrown', '1 January', 'Software Engineer', 'DD, Technical Translation Bureau', 'jbrown.jpg', '', '', 'jbrown@example.com'], ['#16', 'http://asmith.example.com', 'Andrew Smith', 'asmith', '9 August', 'Software Engineer', 'CD, Product Support Service', 'asmith.jpg', '', '', 'asmith@example.com'], ['#17', 'http://jsmith.example.com', 'Jayden Smith', 'jsmith', '8 April', 'Testing Engineer', 'BSD, Presale Solution Bureau', 'jsmith.jpg', '', '', 'jsmith@example.com'], ['#18', 'http://asmith.example.com', 'Alexander Smith', 'asmith', '7 November', 'Shift Engineer', 'Processing Services Division', 'asmith.jpg', '', '', 'asmith@example.com'], ['#19', 'http://dbrown.example.com', 'David Brown', 'dbrown', '20 October', 'Shift Engineer', 'Processing Services Division', 'dbrown.jpg', '', '', 'dbrown@example.com'], ['#20', 'http://nwilliams.example.com', 'Nathan Williams', 'nwilliams', '9 March', 'Shift Engineer', 'CD, Product Support Service', 'nwilliams.jpg', '', '', 'nwilliams@example.com'], ['#21', 'http://dtaylor.example.com', 'Daniel Taylor', 'dtaylor', '5 April', 'Shift Engineer', 'CD, Product Support Service', 'dtaylor.jpg', '', '', 'dtaylor@example.com'], ['#22', 'http://nmoore.example.com', 'Nathan Moore', 'nmoore', '14 July', 'Testing Engineer', 'DD, Technical Translation Bureau', 'nmoore.jpg', '', '', 'nmoore@example.com'], ['#23', 'http://ewilson.example.com', 'Ethan Wilson', 'ewilson', '7 September', 'Software Engineer', 'CD, Product Support Service', 'ewilson.jpg', '', '', 'ewilson@example.com'], ['#24', 'http://awilson.example.com', 'Angel Wilson', 'awilson', '5 December', 'Application Developer', 'BSD, Presale Solution Bureau', 'awilson.jpg', '', '', 'awilson@example.com'], ['#25', 'http://abrown.example.com', 'Angel Brown', 'abrown', '21 October', 'Shift Engineer', 'BSD, Presale Solution Bureau', 'abrown.jpg', '', '', 'abrown@example.com']]
 
rows.insert(0, columns)
print(ascii_table(rows))
 

Выведет:
Код:
id  | url                          | name             | short_name | birthday     | job                   | department                       | photo         | work_phone | mobile_phone | email                
----+------------------------------+------------------+------------+--------------+-----------------------+----------------------------------+---------------+------------+--------------+----------------------
#1  | http://amiller.example.com   | Andrew Miller    | amiller    | 11 December  | Testing Engineer      | CD, Product Support Service      | amiller.jpg   |            |              | amiller@example.com 
#2  | http://ataylor.example.com   | Anthony Taylor   | ataylor    | 17 July      | Software Engineer     | CD, Product Support Service      | ataylor.jpg   |            |              | ataylor@example.com 
#3  | http://dmoore.example.com    | Daniel Moore     | dmoore     | 2 March      | Testing Engineer      | CD, Product Support Service      | dmoore.jpg    |            |              | dmoore@example.com   
#4  | http://dsmith.example.com    | David Smith      | dsmith     | 5 January    | Testing Engineer      | Processing Services Division     | dsmith.jpg    |            |              | dsmith@example.com   
#5  | http://awilson.example.com   | Alexander Wilson | awilson    | 11 April     | Software Engineer     | CD, Product Support Service      | awilson.jpg   |            |              | awilson@example.com 
#6  | http://asmith.example.com    | Alexander Smith  | asmith     | 3 November   | Testing Engineer      | CD, Product Support Service      | asmith.jpg    |            |              | asmith@example.com   
#7  | http://jdavis.example.com    | Jayden Davis     | jdavis     | 10 April     | Shift Engineer        | BSD, Presale Solution Bureau     | jdavis.jpg    |            |              | jdavis@example.com   
#8  | http://jdavis.example.com    | Jacob Davis      | jdavis     | 5 July       | Shift Engineer        | DD, Technical Translation Bureau | jdavis.jpg    |            |              | jdavis@example.com   
#9  | http://ejones.example.com    | Ethan Jones      | ejones     | 14 September | Software Engineer     | BSD, Presale Solution Bureau     | ejones.jpg    |            |              | ejones@example.com   
#10 | http://abrown.example.com    | Angel Brown      | abrown     | 15 April     | Testing Engineer      | Processing Services Division     | abrown.jpg    |            |              | abrown@example.com   
#11 | http://dwilliams.example.com | David Williams   | dwilliams  | 23 November  | Application Developer | DD, Technical Translation Bureau | dwilliams.jpg |            |              | dwilliams@example.com
#12 | http://ddavis.example.com    | Daniel Davis     | ddavis     | 5 September  | Shift Engineer        | DD, Technical Translation Bureau | ddavis.jpg    |            |              | ddavis@example.com   
#13 | http://ntaylor.example.com   | Nathan Taylor    | ntaylor    | 16 February  | Shift Engineer        | BSD, Presale Solution Bureau     | ntaylor.jpg   |            |              | ntaylor@example.com 
#14 | http://dtaylor.example.com   | Daniel Taylor    | dtaylor    | 10 March     | Application Developer | DD, Technical Translation Bureau | dtaylor.jpg   |            |              | dtaylor@example.com 
#15 | http://jbrown.example.com    | Jayden Brown     | jbrown     | 1 January    | Software Engineer     | DD, Technical Translation Bureau | jbrown.jpg    |            |              | jbrown@example.com   
#16 | http://asmith.example.com    | Andrew Smith     | asmith     | 9 August     | Software Engineer     | CD, Product Support Service      | asmith.jpg    |            |              | asmith@example.com   
#17 | http://jsmith.example.com    | Jayden Smith     | jsmith     | 8 April      | Testing Engineer      | BSD, Presale Solution Bureau     | jsmith.jpg    |            |              | jsmith@example.com   
#18 | http://asmith.example.com    | Alexander Smith  | asmith     | 7 November   | Shift Engineer        | Processing Services Division     | asmith.jpg    |            |              | asmith@example.com   
#19 | http://dbrown.example.com    | David Brown      | dbrown     | 20 October   | Shift Engineer        | Processing Services Division     | dbrown.jpg    |            |              | dbrown@example.com   
#20 | http://nwilliams.example.com | Nathan Williams  | nwilliams  | 9 March      | Shift Engineer        | CD, Product Support Service      | nwilliams.jpg |            |              | nwilliams@example.com
#21 | http://dtaylor.example.com   | Daniel Taylor    | dtaylor    | 5 April      | Shift Engineer        | CD, Product Support Service      | dtaylor.jpg   |            |              | dtaylor@example.com 
#22 | http://nmoore.example.com    | Nathan Moore     | nmoore     | 14 July      | Testing Engineer      | DD, Technical Translation Bureau | nmoore.jpg    |            |              | nmoore@example.com   
#23 | http://ewilson.example.com   | Ethan Wilson     | ewilson    | 7 September  | Software Engineer     | CD, Product Support Service      | ewilson.jpg   |            |              | ewilson@example.com 
#24 | http://awilson.example.com   | Angel Wilson     | awilson    | 5 December   | Application Developer | BSD, Presale Solution Bureau     | awilson.jpg   |            |              | awilson@example.com 
#25 | http://abrown.example.com    | Angel Brown      | abrown     | 21 October   | Shift Engineer        | BSD, Presale Solution Bureau     | abrown.jpg    |            |              | abrown@example.com   

Функция небольшая, вам нужно только переписать ее на с++ Подмигивающий
будет круто если сюда приложите ее реализацию Улыбающийся
если у вас возникнут вопросы к коду питона, могу ответить
Записан

panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Февраль 27, 2017, 15:11 »

Вопрос непонятен.
Ты не знаешь как добавить строку "-----------------------------------" к textData ?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
phantom85
Гость
« Ответ #7 : Февраль 27, 2017, 15:17 »

Вопрос непонятен.
Ты не знаешь как добавить строку "-----------------------------------" к textData ?

Как добавить строку я знаю дело в том что количество колонок меняется а так же меняется длина ячейки вот поэтому и получается не понятно что
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #8 : Февраль 27, 2017, 17:53 »

Как добавить строку я знаю дело в том что количество колонок меняется а так же меняется длина ячейки вот поэтому и получается не понятно что

Писать файл за два прохода, в первом измерить размеры столбцов, во втором - уже писать.
Либо заранее определить формат (количество символов) в каждом из столбцов. Решение уже написано выше.
Записан
phantom85
Гость
« Ответ #9 : Февраль 27, 2017, 19:56 »

За код спасибо, буду пробовать переводить
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Февраль 27, 2017, 23:48 »

Стало интересно насколько это будет трудно и решил попробовать самому переписать тот код: https://github.com/gil9red/ascii_table

Пример:
Код
C++ (Qt)
QList<QStringList> rows;
rows << (QStringList() << "ID" << "NAME"            << "AGE");
rows << (QStringList() << "1"  << "Ivan Petrov"     << "42");
rows << (QStringList() << "2"  << "LORD DESTRUCTOR" << "14");
rows << (QStringList() << "3"  << "Petya"           << "22");
 
QString table = ascii_table(rows);
qDebug().nospace().noquote() << table;

Результат:
Код
C++ (Qt)
ID | NAME            | AGE
----+-----------------+----
1  | Ivan Petrov     | 42
2  | LORD DESTRUCTOR | 14
3  | Petya           | 22


Весь код:
Код
C++ (Qt)
#include <QStringList>
#include <QDebug>
 
 
QString ascii_table(const QList<QStringList>& rows) {
   // Список максимальной ширины столбцов -- каждый элемент это отдельный столбец
   // А шириной будет считаться количество символов
   QList<int> lens;
 
   const QStringList& headers = rows[0];
 
   // Перебор по столбцам
   for (int col = 0; col < headers.size(); col++) {
       int max_len = headers[col].size();
 
       for (int row = 1; row < rows.size(); row++) {
           int cell_len = rows[row][col].size();
           if (cell_len > max_len) {
               max_len = cell_len;
           }
       }
 
       lens.append(max_len);
   }
 
   // Генерация шаблона строк таблицы.
   // Если в lens = (2, 15, 3), тогда в formats = ("%-2s", "%-15s", "%-3s")
   // для QString.args = ("%1", "%2", "%3")
   QStringList formats;
   for (int i = 0; i < lens.size(); i++) {
       formats << QString("%%1").arg(i + 1);
   }
 
   QStringList column_separators;
   for (int col_len : lens) {
       column_separators.append(QString().fill('-', col_len));
   }
   QString separators = column_separators.join("-+-");
   QString pattern = formats.join(" | ");
 
   QString table;
 
   for (int row = 0; row < rows.size(); row++) {
       QString row_pattern = pattern;
 
       for (int col = 0; col < lens.size(); col++) {
           int col_len = lens[col];
           QString cell = rows[row][col];
 
           // -col_len -- т.е. выравнивание по левой стороне
           row_pattern = row_pattern.arg(cell, -col_len);
       }
 
       table += " " + row_pattern + "\n";
 
       // TODO: Так лучше не делать, а разделить генерацию заголовка и тела таблицы
       if (row == 0) {
           table += "-" + separators + "\n";
       }
   }
 
   return table;
}
 
 
int main(int argc, char *argv[]) {
   QList<QStringList> rows;
   rows << (QStringList() << "ID" << "NAME"            << "AGE");
   rows << (QStringList() << "1"  << "Ivan Petrov"     << "42");
   rows << (QStringList() << "2"  << "LORD DESTRUCTOR" << "14");
   rows << (QStringList() << "3"  << "Petya"           << "22");
 
   QString table = ascii_table(rows);
   qDebug().nospace().noquote() << table;
 
   return 0;
}
 

Наверняка можно было лучше сделать, но мне было уже лень продумывать и переписывать стало Улыбающийся
« Последнее редактирование: Февраль 27, 2017, 23:55 от gil9red » Записан

phantom85
Гость
« Ответ #11 : Февраль 28, 2017, 10:14 »

 Спасибо огромное, попробую к проекту прикрутить
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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