Программа для создания кроссвордов (Обсуждение исходника)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Программа для создания кроссвордов

Сообщение Voral »

xwicked писал(а):
16.02.2012 23:44
Кто что может сказать про свойства Q_PROPERTY - они не будут лишними или смотря где и как?

На сколько я понимаю они нужны если вы планируете использовать свои классы в QtDesigner. А уж нужно оно вам или нет - это вам решать. Лично я не использую, впрочем как и не использую Designer (хотя это, наверное, не очень правильно - т.к. тоже уровень разделения интерфейса и функционала). Если вы наследуетесь от стандартных GUIвых классов и используете дизайнер, вероятно это полезно, для тех кто захочет работать с вашим проектом
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Программа для создания кроссвордов

Сообщение Voral »

Кстати вот у меня в закладках есть по поводу проперти, в принципе дополнительный профит от использования:

Код: Выделить всё

class SomeClass : public QObject {
     Q_OBJECT
     Q_PROPERTY(bool prop READ prop WRITE setProp);
private:
     bool var;
public:
     SomeClass() : var(true) { }
     bool prop() const { return var; }
     void setProp(bool newValue) { var = newValue; }
};
//а теперь, имея указатель на QObject, мы можем изменять значения переменных унаследованного класса:
SomeClass *sc = new SomeClass;
QObject *obj = sc;
obj->setProperty("prop", true); //тоже самое, что и sc->setProp(true);


Источник
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Программа для создания кроссвордов

Сообщение RasenHerz »

xwicked писал(а):
15.02.2012 23:45
Поделюсь секретом: я хочу в будущем полностью разделить логику от ифейса. Это значит максимально возможное количество кода переписать на чистом С а то, что не получиться - на C++. Чтобы приобрести статус trueЫ. А функцию составления кроссворда выгрузить в разделяемую библиотеку и опубликовать её под BSD. Во как!
ЗЫ: значит у меня всё в норме :)

А как связана логика/интерфейс и язык программирования на котором они реализованы? Читая ваш пост невольно вспоминаю ту самую цитату. Ну и ваше желание стать Ъ - прекратите смешить людей, так вы ничего не добъетесь, написать библиотеку на С и лицензировать ее под BSD может абсолютно любой человек. А вот написать что-то нужное, что оценят другие - это верный путь.

xwicked писал(а):
16.02.2012 23:44
Есть небольшой план по объектной ориентации. Кто что может сказать про свойства Q_PROPERTY - они не будут лишними или смотря где и как?

Q_PROPERTY нужно только в случае если вы активно взаимодействуете с мета-информацией объектов (например, экспортируете свои классы в QScriptEngine).
Спасибо сказали:
Аватара пользователя
xwicked
Сообщения: 115
ОС: GNU / Linux Debian 7 amd64

Re: Программа для создания кроссвордов

Сообщение xwicked »

RasenHerz писал(а):
22.02.2012 03:02
...
Q_PROPERTY нужно только в случае если вы активно взаимодействуете с мета-информацией объектов (например, экспортируете свои классы в QScriptEngine).
У Шлее только что прочитал тоже самое, значит буду использовать. В будущем пригодится.
Спасибо сказали:
Аватара пользователя
xwicked
Сообщения: 115
ОС: GNU / Linux Debian 7 amd64

Re: Программа для создания кроссвордов

Сообщение xwicked »

Оптимизация констант:

Код: Выделить всё

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;
- Исправлена нумерация вопросов кроссворда при печати и экспорте;
- Оптимизирована скорость отображения статистики;
- Изменён цветовой стиль сетки кроссворда, уменьшен контраст цветов;
Спасибо сказали:
Аватара пользователя
xwicked
Сообщения: 115
ОС: GNU / Linux Debian 7 amd64

Re: Программа для создания кроссвордов

Сообщение xwicked »

Все изменения:
- Добавлена возможность создать словарь из текстового файла со
словами;
- Добавлена возможность выбора путей к файлу свойств, файлу статистики, файлу словаря;
- Исправлена фатальная ошибка при вводе слов в сетку, без координат слов;
- Добавлена поддержка файла кроссворда формата OpenKlest 1.1;
- Добавлено сохранение положений панелей инструментов при выходе из программы;
- Добавлены новые классы: TCell, TGrid и tfileoptions;
- Добавлена возможность удалённого расположения файла свойств;
- В свойства игры добавлены кнопки "Сбросить" и "Восстановить умолчания";
- Изменены ссылки баг-трекера и git;
- Добавлена возможность разворачивания на весь экран окон статистики и руководства пользователя;
- Название программы и номер версии вынесены в отдельный заголовочный файл;

Новая версия 1.2.3
Мной было принято решение о прекращении сборок в linux-пакеты в пользу простоты установки, оформив всё в виде мастера-установщика как в ОС Оффтопик. В связи с замедлением процесса разработки прошу давать советы на крайне необходимые функции и указания на исправление критических ошибок.

Благодарю!
Спасибо сказали: