xwicked |
Дата 6.5.2013, 21:36 |
|
Все изменения: Цитата - Добавлена возможность создать словарь из текстового файла со словами; - Добавлена возможность выбора путей к файлу свойств, файлу статистики, файлу словаря; - Исправлена фатальная ошибка при вводе слов в сетку, без координат слов; - Добавлена поддержка файла кроссворда формата OpenKlest 1.1; - Добавлено сохранение положений панелей инструментов при выходе из программы; - Добавлены новые классы: TCell, TGrid и tfileoptions; - Добавлена возможность удалённого расположения файла свойств; - В свойства игры добавлены кнопки "Сбросить" и "Восстановить умолчания"; - Изменены ссылки баг-трекера и git; - Добавлена возможность разворачивания на весь экран окон статистики и руководства пользователя; - Название программы и номер версии вынесены в отдельный заголовочный файл; Новая версия 1.2.3 Мной было принято решение о прекращении сборок в linux-пакеты в пользу простоты установки, оформив всё в виде мастера-установщика как в ОС Оффтопик. В связи с замедлением процесса разработки прошу давать советы на крайне необходимые функции и указания на исправление критических ошибок.
Благодарю! |
xwicked |
Дата 11.6.2012, 16:14 |
|
Оптимизация констант: 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 вместе с изображением: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; - Исправлена нумерация вопросов кроссворда при печати и экспорте; - Оптимизирована скорость отображения статистики; - Изменён цветовой стиль сетки кроссворда, уменьшен контраст цветов; |
Алексей1153 |
Дата 10.2.2012, 6:45 |
|
свич - это великолепная штука, когда нужно выбрать одину из циферных констант, сравнивая со значением тестируемой переменной (как в mydefines::GetExt )
работает быстро, так как компилятор строит табличную адресацию, а не перебор множества условий, как можно было бы подумать. То есть, практически вычисляется тот же индекс, по которому берётся адрес перехода для jmp , делается переход. |
xwicked |
Дата 9.2.2012, 21:52 |
|
Цитата(Алексей1153 @ 9.2.2012, 20:52) ... фиговый вариант ... Ну, в таком случае, я лучше сам буду разбираться и проверять качество советов. Просто этот совет со switch мне дали с другого форума. Извини, пока вопросов больше нет |
Алексей1153 |
Дата 9.2.2012, 19:52 |
|
>>Насчёт остального мне пока квалификации не хватает, чтобы понять, где что
задавай вопросы, расскажу, что там я сделал
Цитата(xwicked @ 9.2.2012, 18:34) А такой вариант покатит, чтобы switch заменить? фиговый вариант
а функция GetPath тоже, наверное, лучше всё же через свич сделать, а не через мап. В данном случае. |
xwicked |
Дата 9.2.2012, 15:34 |
|
Цитата(Алексей1153 @ 9.2.2012, 8:37) можно немного встряну ))
предлагаю более ООП варианты: ... Благодарю, вариант enum ee_path_id, enum ee_ext_id я уже сам собирался так оформить. Насчёт остального мне пока квалификации не хватает, чтобы понять, где что Вчера прочитал главу про классы(C++) - потихоньку буду разбираться. А такой вариант покатит, чтобы switch заменить?char Test[13][6] = {".pdf",".ps",".html",".txt",".jpg",".jpeg",".bmp",".tiff",".png",".xpm",".xbm",".ppm",".ok"}; // подготовка ..... sFilter = Test[iTypeExport]; // замена свитча
|
Алексей1153 |
Дата 9.2.2012, 7:37 |
|
можно немного встряну ))
предлагаю более ООП варианты:
с массивом лучше так
//A - класс кроссвоода #include <vector> class A { enum { e_W=50, e_H=50, e_init=0, };
typedef ushort td_elem;//тип элемента typedef std::vector<td_elem> td_row;//тип строки typedef std::vector<td_row> td_table;//тип таблицы
td_table m_usTable;
A(); };
A::A() :m_usTable(e_H,td_row(e_W,td_elem(e_init))) { }
//где-то в программе: ushort current_row=4; ushort current_col=7; m_usTable[current_row][current_col]=td_elem('A');
по остальному - глобальные дефайны лучше объединять в класс
файл "mydefines.h"
//Определение путей констант, в соответствии с системой class mydefines { public: enum { MODE_VIEW =true, MODE_EDIT =false,
ACROSS_ENABLE =true, ACROSS_DISABLE =false,
LANGUAGE_RUSSIAN =true, LANGUAGE_ENGLISH =false,
TOOLBAR_SHOW =true, TOOLBAR_HIDE =false,
EXPORT_YES =true, EXPORT_NO =false, };
enum ee_path_id { PATH_TMP_SET , PATH_SHARE_DOC , PATH_SHARE_APP , PATH_TMP_STAT , };
enum ee_ext_id { TYPE_PDF , TYPE_POST_SCRIPT , TYPE_HTML , TYPE_TXT , TYPE_JPG , TYPE_JPEG , TYPE_BMP , TYPE_TIFF , TYPE_PNG , TYPE_XPM , TYPE_XBM , TYPE_PPM , TYPE_OPEN_KLEST , };
//Пути для разработки и отладки программы static QString GetPath(ee_path_id id);
//расширение (без точки) static QString GetExt(ee_ext_id id); };
файл "mydefines.cpp"
#include <map> QString mydefines::GetPath(ee_path_id id) { typedef std::map<ee_path_id,QString> td_map; static td_map _map;
if(_map.empty()) { #if defined(Q_WS_WIN) _map[PATH_TMP_SET ]=QApplication::applicationDirPath() + "/settings.xwsc"; _map[PATH_SHARE_DOC ]=QApplication::applicationDirPath(); _map[PATH_SHARE_APP ]=QApplication::applicationDirPath(); _map[PATH_TMP_STAT ]=QApplication::applicationDirPath() + "/cstat.html"; #elif defined(Q_WS_X11) _map[PATH_TMP_SET ]="/tmp/klest-crossword-0.3.7/settings.xwsc"; _map[PATH_SHARE_DOC ]="/usr/share/doc/klest-crossword-0.3.7"; _map[PATH_SHARE_APP ]="/usr/share/klest-crossword-0.3.7"; _map[PATH_TMP_STAT ]="/tmp/klest-crossword-0.3.7/cstat.html"; #elif defined(Q_WS_MAC) _map[PATH_TMP_SET ]=QApplication::applicationDirPath() + "/settings.xwsc"; _map[PATH_SHARE_DOC ]=QApplication::applicationDirPath(); _map[PATH_SHARE_APP ]=QApplication::applicationDirPath(); _map[PATH_TMP_STAT ]=QApplication::applicationDirPath() + "/cstat.html"; #endif }
td_map::const_iterator it=_map.find(id); if(it==_map.end())return ""; return it->second; }
QString mydefines::GetExt(ee_ext_id id) { switch(id) { case TYPE_PDF :return "pdf";break; case TYPE_POST_SCRIPT :return "ps" ;break; case TYPE_HTML :return "html";break; case TYPE_TXT :return "txt";break; case TYPE_JPG :return "jpg";break; case TYPE_JPEG :return "jpeg";break; case TYPE_BMP :return "bmp";break; case TYPE_TIFF :return "tiff";break; case TYPE_PNG :return "png";break; case TYPE_XPM :return "xpm";break; case TYPE_XBM :return "xbm";break; case TYPE_PPM :return "ppm";break; case TYPE_OPEN_KLEST :return "ok" ;break; }
return ""; }
и где-то в прогремме:
QString filename= mydefines::GetPath(mydefines::PATH_SHARE_DOC) +"1234" +"." +mydefines::GetExt(mydefines::TYPE_BMP) ;
ну а по структуре TFileOptions - я уже говорил, что там не так |
xwicked |
Дата 8.2.2012, 22:48 |
|
Здравствуйте! Как я избавился от переполнения стека:ushort usTable[50][50];//Массив сетки кроссворда Если делал больше 50-ти, то отваливался импорт файла и запуск руководства пользователя Изменил на:ushort **usTable;//Массив сетки кроссворда ... //Создание двумерного динамического массива usTable = new ushort*[TableKlestCrossword->rowCount()];
for(int i = 0; i < TableKlestCrossword->rowCount(); i++) usTable[i] = new ushort[TableKlestCrossword->columnCount()]; Далее введены константы://Определение путей констант, в соответствии с системой #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: 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; } Введение структуры файла свойств://Структура файла свойств программы struct TFileOptions { bool bModeWork,//Режим работы программы bLanguageProgram,//Язык программы bStateStandardToolbar,//Состояние показа стандартной панели bStateExport,//Состояние экспортирования bCurrentDictionary;//Текущий словарь QString sModePassword,//Пароль режима sPathCrossword,//Путь для кроссвордов sPathExport,//Путь для экспорта sPathTemplate;//Путь для шаблонов int iNumberTimes,//Количество раз iTypeExport;//Тип экспорта }; Скачать 0.3.7. На данный момент это последняя версия, прошу... |
xwicked |
Дата 28.1.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-страница и распечатывается на принтере, но печать идёт не на физическое устройство а в файл 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 |
Дата 1.12.2011, 5:52 |
|
Цитата(Sokoloff @ 29.11.2011, 12:05) ... В линухе можно настроить виртуальный принтер печатающий в PostScript файл. Благодарю! Я собственно говоря, так и делал. Без этой возможности печать вообще не появилась бы Ну а если разница между печатью в файл и на физическом принтере нулевая, то я и дальше продолжу тестировать её таким же образом |
Просмотр темы полностью (откроется в новом окне) |
|