Russian Qt Forum
Декабрь 10, 2019, 12:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Программа для создания кроссвордов[обсуждение исходника]  (Прочитано 29927 раз)
xwicked
Гость
« Ответ #30 : Январь 28, 2012, 16:04 »

Следующая версия программы 0.2.9. В ней я походу вышел за предел стека   Веселый: Ошибку я уже нашёл.

Цитировать
- Оптимизирован алгоритм выбора слов в 2,5 раза;
- Добавлена возможность экспорта кроссворда в файл, форматов: HTML, PDF, PostScript, текстовый формат AcrossLite, OpenKlest(*.ok);
- Добавлена возможность поворота кроссворда;
- Добавлена возможность автоматического создания и экспорта кроссворда в форматы HTML, PDF, PostScript, текстовый формат AcrossLite, OpenKlest(*.ok);
- Добавлена возможность импорта кроссворда в формате OpenKlest(*.ok);
Экспорт в PDF и PostScript осуществляется достаточно просто: подготавливается HTML-страница и распечатывается на принтере, но печать идёт не на физическое устройство а в файл Улыбающийся
Код
C++ (Qt)
   QTextEdit textEdit;
   textEdit.setHtml(strHTML);
#ifndef QT_NO_PRINTER
 
   QPrinter printer(QPrinter::HighResolution);//Настройка принтера на  высокое качество
   printer.setOutputFormat(QPrinter::PostScriptFormat);//Выбор печати в файл PostScript
   printer.setOutputFileName(sExportName);//Присваивание имени файла
   textEdit.document()->print(&printer);//Сама печать
 
#endif
Хотелось бы отметить, что с появлением функции экспорта кроссворда в Across Lite TXT, у программы across lite 2.0 появилась возможность отгадывать нетолько американские кроссворды, но и классические, правда всё в английском языке. Можете поэксперементировать, ради интереса   Строит глазки
Записан
xwicked
Гость
« Ответ #31 : Февраль 08, 2012, 22:56 »

Здравствуйте! Как я избавился от переполнения стека:
Код
C++ (Qt)
ushort usTable[50][50];//Массив сетки кроссворда
Если делал больше 50-ти, то отваливался импорт файла и запуск руководства пользователя   Веселый
Изменил на:
Код
C++ (Qt)
ushort **usTable;//Массив сетки кроссворда
...
//Создание двумерного динамического массива
       usTable = new ushort*[TableKlestCrossword->rowCount()];
 
       for(int i = 0; i < TableKlestCrossword->rowCount(); i++)
           usTable[i] = new ushort[TableKlestCrossword->columnCount()];
 
Далее введены константы:
Код
C++ (Qt)
//Определение путей констант, в соответствии с системой
#if defined(Q_WS_WIN)
 
   #define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwsc"
   #define PATH_SHARE_DOC QApplication::applicationDirPath()
   #define PATH_SHARE_APP QApplication::applicationDirPath()
   #define PATH_TMP_STAT QApplication::applicationDirPath() + "/cstat.html"
 
 
#elif defined(Q_WS_X11)
 
   #define PATH_TMP_SET "/tmp/klest-crossword-0.3.7/settings.xwsc"
   #define PATH_SHARE_DOC "/usr/share/doc/klest-crossword-0.3.7"
   #define PATH_SHARE_APP "/usr/share/klest-crossword-0.3.7"
   #define PATH_TMP_STAT "/tmp/klest-crossword-0.3.7/cstat.html"
 
#elif defined(Q_WS_MAC)
 
   #define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwsc"
   #define PATH_SHARE_DOC QApplication::applicationDirPath()
   #define PATH_SHARE_APP QApplication::applicationDirPath()
   #define PATH_TMP_STAT QApplication::applicationDirPath() + "/cstat.html"
 
 
#endif
 
//Пути для разработки и отладки программы
/*#define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwsc"
#define PATH_SHARE_DOC QApplication::applicationDirPath()
#define PATH_SHARE_APP QApplication::applicationDirPath()
#define PATH_TMP_STAT QApplication::applicationDirPath() + "/cstat.html"*/

 
#define MODE_VIEW true
#define MODE_EDIT false
 
#define ACROSS_ENABLE true
#define ACROSS_DISABLE false
 
#define LANGUAGE_RUSSIAN true
#define LANGUAGE_ENGLISH false
 
#define TOOLBAR_SHOW true
#define TOOLBAR_HIDE false
 
#define EXPORT_YES true
#define EXPORT_NO false
 
#define TYPE_PDF 0
#define TYPE_POST_SCRIPT 1
Что позволило пути в программе менять всего один раз Улыбающийся Так же появилась возможность убрать лишние условия и оформить в switch:
Код
C++ (Qt)
       switch(iTypeExport)
       {
       case TYPE_PDF:
           sFilter = ".pdf";
           break;
 
       case TYPE_POST_SCRIPT:
           sFilter = ".ps";
           break;
 
       case TYPE_HTML:
           sFilter = ".html";
           break;
 
       case TYPE_TXT:
           sFilter = ".txt";
           break;
 
       case TYPE_JPG:
           sFilter = ".jpg";
           break;
 
       case TYPE_JPEG:
           sFilter = ".jpeg";
           break;
 
       case TYPE_BMP:
           sFilter = ".bmp";
           break;
 
       case TYPE_TIFF:
           sFilter = ".tiff";
           break;
 
       case TYPE_PNG:
           sFilter = ".png";
           break;
 
       case TYPE_XPM:
           sFilter = ".xpm";
           break;
 
       case TYPE_XBM:
           sFilter = ".xbm";
           break;
 
       case TYPE_PPM:
           sFilter = ".ppm";
           break;
 
       case TYPE_OPEN_KLEST:
           sFilter = ".ok";
           break;
       }
Введение структуры файла свойств:
Код
C++ (Qt)
//Структура файла свойств программы
struct TFileOptions
{
    bool bModeWork,//Режим работы программы
         bLanguageProgram,//Язык программы
         bStateStandardToolbar,//Состояние показа стандартной панели
         bStateExport,//Состояние экспортирования
         bCurrentDictionary;//Текущий словарь
    QString sModePassword,//Пароль режима
            sPathCrossword,//Путь для кроссвордов
            sPathExport,//Путь для экспорта
            sPathTemplate;//Путь для шаблонов
    int iNumberTimes,//Количество раз
        iTypeExport;//Тип экспорта
};
Скачать 0.3.7. На данный момент это последняя версия, прошу...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4095



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

а чем QDir::tempPath() не устраивает?

другие дефайны я так понимаю служат для разных конфигураций приложения. для этой цели лучше создать разные таргеты и задать дефайны в свойствах таргетов.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xwicked
Гость
« Ответ #33 : Февраль 08, 2012, 23:29 »

а чем QDir::tempPath() не устраивает? ...
Об этом я узнал позже(11.12.11), в следующей версии обязательно буду использовать, только не временный, а домашний каталог пользователя.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4095



Просмотр профиля WWW
« Ответ #34 : Февраль 09, 2012, 02:04 »

если это обычные настройки приложения, то с ними лучше работать через QSettings
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xwicked
Гость
« Ответ #35 : Февраль 11, 2012, 22:36 »

если это обычные настройки приложения, то с ними лучше работать через QSettings
Кстати, А QSettings пишет в оффтопике в реестр или можно на ini настроить?
Если только реестр - буду реализовывать свой класс.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4095



Просмотр профиля WWW
« Ответ #36 : Февраль 12, 2012, 00:37 »

может и туда и туда, см. конструктор
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xwicked
Гость
« Ответ #37 : Февраль 12, 2012, 00:46 »

может и туда и туда, см. конструктор
Благодарю, а то Шлее меня сразу выпугал всего. Про ini, это я в сети случайно увидел и решил переспросить.
Записан
xwicked
Гость
« Ответ #38 : Июнь 11, 2012, 16:15 »

Оптимизация констант:
Код
C++ (Qt)
enum eTypeCrossword {TYPE_PDF, TYPE_POST_SCRIPT, TYPE_RTF, TYPE_HTML, TYPE_TXT, TYPE_JPG, TYPE_JPEG, TYPE_BMP,
                   TYPE_TIFF, TYPE_PNG, TYPE_XPM, TYPE_XBM, TYPE_PPM, TYPE_OPEN_KLEST};
 
Экспорт в RTF вместе с изображением:
Код
C++ (Qt)
QString TCrosswordGrid::wordToUnicode(QString sWord)
{
   QString sTemp;
 
   for (int i = 0; i < sWord.length(); i++)
//Добавляет один символ Unicode, если этого не получается сделать, то отображается знак вопроса
       sTemp.append("\\u" + QString::number(sWord.at(i).unicode()) + "?");
 
   return sTemp;
}
 
//Формирование RTF-документа и сохранение
void TCrosswordGrid::saveToRTF(QString sExportName, QString strRTF, QImage imgExport)
{
   QByteArray baImage;
   QBuffer buffer(&baImage);
   buffer.open(QIODevice::WriteOnly);
   imgExport.save(&buffer, "BMP");//BMP как обязательный формат изображения
   baImage = baImage.toHex();//Побайтовое преобразование изображения в шестнадцатеричную форму
   QFile ifile(sExportName);
   QTextStream istream(&ifile);
   istream.setCodec("UTF-8");//UTF-8 кодировка документа
   ifile.open(QIODevice::WriteOnly);
//Добавление информации об изображении с сохранением изначального размера
   istream << "{\\rtf1\n{\\pict\\wmetafile8\\picw" + QString::number(columnCount() * rowHeight(0) * 27) + "\\pich"
           + QString::number(rowCount() * rowHeight(0) * 27) + "\n";
 
   int j = 0;
 
   for (int i = 0; i < baImage.size(); i++)
   {
       if (j == 128)//Если количество символов в строке == 128
       {
           istream << "\n";//То перевод строки; Избавляет от ошибок, при чтении документа.
           j = 0;
       }
 
       istream << baImage.at(i);
       j++;
   }
   istream << "}\\par\\par\n";
   istream << strRTF;
   istream << "}";
   ifile.close();
}
 
//Формирование RTF-текста вопросов и ответов
QString TCrosswordGrid::makeRTFText(QString ListWordH, QString ListWordV, QStringList ListOutV, QStringList ListOutH)
{
   QString strRTF;
   QString strText1;
   QString strText2;
   QString strText3;
 
   for(int i = 0; i < ListOutH.count(); i++)
   {
       strText1.append(wordToUnicode(ListOutH.at(i)) + "\\par\n");
   }
 
   strText2.clear();
 
   for(int i = 0; i < ListOutV.count(); i++)
   {
       strText2.append(wordToUnicode(ListOutV.at(i)) + "\\par\n");
   }
 
   strText3.clear();
   strText3 = "{\\b " + wordToUnicode(tr("Horizontal")) + "}:\\par\n" + wordToUnicode(ListWordH) + "\\par\n" + "{\\b " + wordToUnicode(tr("Vertical"))
              +"}:\\par\n" + wordToUnicode(ListWordV) + "\\par\n";
 
   strRTF.append("{\\b " + wordToUnicode(tr("Horizontal")) + "}:\\par\n"
                  + strText1 + "\\par\n"
                  "{\\b " + wordToUnicode(tr("Vertical")) + "}:\\par\n"
                  + strText2 + "\\par\n"
                  "{\\b\\i " + wordToUnicode(tr("Answers")) + "}:\\par\n"
                  + strText3 + "\\par\n");
   return strRTF;
}
 
 
Использовался материал Википедии. Скачать 1.0.0.
Цитировать
Список изменений:
- Повышена безопасность работы игры;
- Добавлен экспорт кроссворда в RTF;
- Исправлена нумерация вопросов кроссворда при печати и экспорте;
- Оптимизирована скорость отображения статистики;
- Изменён цветовой стиль сетки кроссворда, уменьшен контраст цветов;
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4095



Просмотр профиля WWW
« Ответ #39 : Июнь 11, 2012, 16:21 »

а объекты по-прежнему передаются по значению, а не по константной ссылке – очень нехорошо
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xwicked
Гость
« Ответ #40 : Июнь 11, 2012, 16:58 »

а объекты по-прежнему передаются по значению, а не по константной ссылке – очень нехорошо
Такие "мелочи" я буду исправлять постепенно. Привычка просто Подмигивающий
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4095



Просмотр профиля WWW
« Ответ #41 : Июнь 11, 2012, 17:23 »

это вовсе не мелочи. писать правильно лучше сразу.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10611


Просмотр профиля
« Ответ #42 : Июнь 11, 2012, 17:29 »

а объекты по-прежнему передаются по значению, а не по константной ссылке – очень нехорошо
Такие "мелочи" я буду исправлять постепенно. Привычка просто Подмигивающий
Чем дальше - тем труднее избавиться от этой вредной привычки. Которая прозрачно намекает что Ваши познания ограничиваются Qt и без него ... В общем явная "ложка дегтя" в неплохом, боевом проекте
Записан
xwicked
Гость
« Ответ #43 : Июнь 11, 2012, 17:44 »

... Чем дальше - тем труднее избавиться от этой вредной привычки. Которая прозрачно намекает что Ваши познания ограничиваются Qt и без него ... В общем явная "ложка дегтя" в неплохом, боевом проекте
Сначала я узнал о QString и, вначале, файл кроссворда представлял один QString. Потом познакомился с QStringList, код значительно упростился и так далее. То, что я переделываю двойную работу - это нехорошо и я это знаю. Но, в это время, кто-то уже пользуется программой, не вдаваясь в код.
Сейчас это только затрудняет помощь мне, только и всего. Придя к профессионализму - у меня уже будут 4-е по-настоящему Мегапроекта Подмигивающий Как-то вот так...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4095



Просмотр профиля WWW
« Ответ #44 : Июнь 11, 2012, 17:47 »

Придя к профессионализму - у меня уже будут 4-е по-настоящему Мегапроекта Подмигивающий
и ЧСВ over 9000 судя по всему
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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