crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Программа для создания электронных книг, Обсуждение программы и кода
xwicked
  опции профиля:
сообщение 8.8.2011, 20:36
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте! Вот вторая моя программа, написанная на C++(Qt). Выношу на обсуждение её и исходник - 0.0.7.

Ссылка на SourceForge.net. Код под GNU GPL v2 - OpenSource.

Она предназначена для создания электронных книг, с централизованным хранением в базе данных SQLite3.

Этот код публикуется впервые. Его не было нигде, включая репозиторий программ Sisyphus от дистрибутива AltLinux. Там был только Клёст-кроссворд(0.1.9, 0.2.0). Комментируем Windows-версия.

Описание:
Страница книги представляет собой одну переменную QString Page.
Текст книги отображается в компоненте QTextEdit TextBook.
Текст в компоненте TextBook имеет форматирование документа HTML. Поэтому редактирование текста страницы осуществляется редактированием html-кода.

Стандартное сохранение идёт в базу данных. Но есть и возможность экспорта в файл.

Изображения хранятся, как в обычной html-странице - отдельно от текста в папке "temp". В тексте указывается путь.
При загрузке книги - во всех страницах происходит перезапись тегов изображения "<img src=":
      QString str1;
      int iFirst,
          iLast,
          iLength,
          iSearch;
          for(int i = 0; i < ListPages.count(); i++)
              {
                  str1 = ListPages.at(i);
                      if(str1.indexOf("<img src=\"") != -1)
                          {
                               int z = 1;
                               iSearch = 0;
                                   while(str1.indexOf("<img src=\"", iSearch) != -1)
                                       {
                                                if(z == 1) iSearch = -1;
                                                if(iSearch == -1)
                                                    {
                                                         iFirst = str1.indexOf("<img src=\"", 0);
                                                         iLast = str1.indexOf("/temp/Image", 0);
                                                         z++;
                                                    }
                                                else
                                                    {
                                                         iFirst = str1.indexOf("<img src=\"", iSearch);
                                                         iLast = str1.indexOf("/temp/Image", iFirst);
                                                    }
                                            iFirst += 10;
                                            iLength = iLast - iFirst;
                                            str1.remove(iFirst, iLength);
                                            str1.insert(iFirst, "/tmp/xwel");
                                            ListPages.replace(i, str1);
                                            iSearch = iLast;
                                       }
                          }
              }
Это актуально для переносимой версии. В этом случае необходимо будет поменять строку:
str1.insert(iFirst, "/tmp/xwel");
на
str1.insert(iFirst, QApplication::applicationDirPath());//Текущая папка, из которой запущено приложение
Пароль книги хранится в открытом виде в переменной QString Password.
Список страниц хранится в списке строк QStringList ListPages.
Изображения хранятся в массиве QByteArray ListImages[255]. Здесь видно, что изображений на всю книгу 255.

Сохранение в базу происходит обычными SQL-запросами:
      strBook = "DROP TABLE Table" + sNumBook + ";";
      QueryBook.exec(strBook);
      strBook = "CREATE TABLE Table" + sNumBook + " (Pages VARCHAR, Images BLOB);";
      QueryBook.exec(strBook);
      ...
      //Сохранение страниц
      if(ListPages.count() != 0)
          for(int i = 0; i < ListPages.count(); i++)
              {
                 QueryBook.prepare("INSERT INTO Table" + sNumBook + " (Pages) VALUES (?);");
                 QueryBook.bindValue(0, ListPages.at(i));
                 QueryBook.exec(/*strBook*/);
              }
      //Сохранение изображений
          for(int i = 0; i < 75; i++)//Здесь видно - что сохраняются только 75 изображений(!) из 255 :(
              {
                    if(ListImages[i].count() != 0)
                       {
                          QueryBook.prepare("INSERT INTO Table" + sNumBook + " (Images) VALUES (?);");
                          QueryBook.bindValue(0, ListImages[i]);
                          QueryBook.exec(/*strBook*/);
                       }
                   else break;
       }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
xwicked
  опции профиля:
сообщение 16.10.2011, 12:14
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте! Версия 0.1.3 содержит добавление защиты документов дополнительной информации от случайного изменения в режиме просмотра:
              connect(ListAdditionallyWidget, SIGNAL(doubleClicked(QModelIndex)), SLOT(slotRunFile()));
      
          void ListAdditionally::slotRunFile()
          {
              if(*sItem == tr("Documents") && gRegime == true)
                  {
                      QString sTmp;
                      sTmp = ListAdditionallyWidget->item(ListAdditionallyWidget->currentRow())->text();
                      int ipos = sTmp.lastIndexOf("/") + 1;
                      sTmp.remove(0, ipos);
                      QFile ifile(ListAdditionallyWidget->item(ListAdditionallyWidget->currentRow())->text());
                      QDataStream idata(&ifile);
                      QByteArray bfile;
                      ifile.open(QIODevice::ReadOnly);
                      bfile = ifile.readAll();
                      QFile ofile("/tmp/xwel/tempfile/" + sTmp);
                      QDataStream odata(&ofile);
                      ofile.open(QIODevice::WriteOnly);
                      ofile.write(bfile);
                      ifile.close();
                      ofile.close();
                      QDesktopServices::openUrl(QUrl::fromLocalFile("/tmp/xwel/tempfile/" + sTmp));//Открытие копии документа
                  }
               else
      //Открытие оригинала документа
               QDesktopServices::openUrl(QUrl::fromLocalFile(ListAdditionallyWidget->item(ListAdditionallyWidget->currentRow())->text()));
          }
То бишь, происходит простое копирование во временный файл документа и его запуск. Но, есть одно небольшое ограничение, при использовании такого подхода(bfile = ifile.readAll();) - файл читается в переменную полностью и он не должен быть слишком большим. А все изменения выглядят вот так:
Цитата
- Исправлена ошибка возможной потери пароля, при экспорте;
- Добавлена защита документов дополнительной информации в режиме просмотра от случайного изменения;
- Появилась функция экспорта всех книг;
- Исправлена ошибка неполного показа длинных названий книг или издательств в списке книг;
- В окне "О программе" все ссылки, для удобного поиска, изменили цвет на синий;
- Исправлена ошибка возможности редактирования списка книг в режиме просмотра;
- В таблицу списка книг добавлены пункты: "Категория", "Подкатегория";
- Исправлена ошибка неудаления книги из базы, при удалении её из списка книг;
- В меню "Помощь" добавились пункты: "Пожертвовать" и "Получить исходный код".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- xwicked   Программа для создания электронных книг   8.8.2011, 20:36
- - Алексей1153   лично я просел на фразе "Этот код публикуется...   8.8.2011, 21:32
|- - xwicked   Цитата(Алексей1153 @ 8.8.2011, 21:32) ......   9.8.2011, 22:27
- - xwicked   Вот спекфайл, по которому можно собрать rpm-пакет ...   10.8.2011, 9:00
- - xwicked   Здравствуйте! Следующая версия программы 0.0....   12.8.2011, 21:11
- - xwicked   Теперь и счастливым обладателям дистрибутивов GNU ...   15.8.2011, 6:31
- - xwicked   Здравствуйте! В этой версии я сделал одно важ...   17.8.2011, 21:42
|- - xwicked   Цитата(xwicked @ 17.8.2011, 22:42) ... Та...   27.8.2011, 20:49
- - xwicked   Здравствуйте! Вот новая версия 0.1.1 - исходны...   18.8.2011, 21:08
- - xwicked   Здравствуйте! Версия 0.1.3 содержит добавление...   16.10.2011, 12:14
- - xwicked   В версии 0.1.4 добавилась функция печати: void Ele...   20.11.2011, 19:28
- - xwicked   Здравствуйте! Версия 0.1.8 //Изменение таблицы...   31.1.2012, 21:52
- - xwicked   В версии 0.1.9 добавлена работа с несколькими библ...   11.2.2012, 23:05
- - xwicked   Здравствуйте! Оптимизирована функция изменения...   17.2.2012, 21:40
- - xwicked   Здравствуйте! Новый код. Версия 1.0.0 - это пе...   3.4.2012, 20:10
- - xwicked   Здравствуйте! Новая версия. 1.0.5. Тут прошу ...   2.2.2013, 22:17


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.11.2024, 22:46