1

http://labfreetech.org/manual/crosswordviewer/image/Image1.png

Здравствуйте! Есть одна программа для создания кроссвордов. Она состоит из двух частей: создание и отгадывание.

Прошу её код хорошо покритиковать. Для остальных, чтобы могли посмотреть на её работу, дам ссылки на бинарники 32-бит: создание, отгадывание. Qt-4.5.3.

Проекты OpenSource под GPLv2. Ссылки на SourceForge.net - создание, отгадывание.
Это мой первый код на C++(Qt). Жду комментариев  smile

Добавлю небольшое описание: Сетка кроссворда представлена обычной таблицей TableCrosswordEdit(QTableWidget), слова загружаются в список слов ListWord(QStringList), толкования(вопросы) находятся в списке вопросов ListQuestions(QListWidget).

Структура файла - динамическая. Когда писал программы на Delphi - использовал статику - расходовалось лишнее дисковое пространство .
XWC: Пароль, количество строк, количество столбцов, ширина(высота) ячейки таблицы, шрифт, структура таблицы(w + 1(x) - белая ячейка, b + 1( c ) - чёрная), строка с данными CrosswordData(QString).

... if(file.open(QIODevice::WriteOnly))
                   {
                       QBrush BrushBlack = QBrush(Qt::black, Qt::SolidPattern);
                       QDataStream sfile(&file);
                       QChar sdata;
                       ushort idata;

                           if(State == false) sfile << strPassword;

                       sfile << TableCrosswordEdit->rowCount();
                       sfile << TableCrosswordEdit->columnCount();
                       sfile << TableCrosswordEdit->rowHeight(0);
                       sfile << TableCrosswordEdit->font();

                           for(int i = 0; i < TableCrosswordEdit->rowCount(); i++)
                               for(int j = 0; j < TableCrosswordEdit->columnCount(); j++)
                                   {
                                           if(TableCrosswordEdit->item(i,j)->background() == BrushBlack)
                                               {
                                                   sdata = 'b';
                                                   idata = sdata.unicode() + 1;
                                                   sfile << idata;
                                               }
                                           else
                                               {
                                                   sdata = 'w';
                                                   idata = sdata.unicode() + 1;
                                                   sfile << idata;
                                               }
                                              
                                       sdata = 0;
                                   }

                           if(State == false) CrosswordToData(2);
                           if(State == false) sfile << CrosswordData;

                       file.close();

                           if(State == false) SaveStateCross = true;
                           else SaveStateTemplate = true;
                   } ...

CrosswordData: цикл по количеству слов(q, QChar(номер слова), QChar(координата строки в сетке), QChar(координата столбца в сетке), направление слова в сетке), цикл по количеству слов(W, QChar(номер слова), QChar(длина слова), само слово), цикл по количеству вопросов(Q, QChar(номер вопроса), QChar(длина вопроса), сам вопрос).

...
                       for(int i = 0; i < ListWord.count(); i++)
                           {
                               CrosswordData.append(QChar('W'));
                               CrosswordData.append(QChar(ushort(i)));
                               CurrentString.clear();
                               CurrentString.append(ListWord.at(i));
                               CrosswordData.append(QChar(ushort(CurrentString.length())));
                               CrosswordData.append(ListWord.at(i));
                           }

                       for(int i = 0; i < ListQuestions->count(); i++)
                           {
                               CrosswordData.append(QChar('Q'));
                               CrosswordData.append(QChar(ushort(i)));
                               CrosswordData.append(QChar(ushort(ListQuestions->item(i)->text().length())));
                               CrosswordData.append(ListQuestions->item(i)->text());
                           } ...

Шаблон кроссворда(XWTPL) таже структура, но без пароля и без CrosswordData.

Состояние сохранения(tmpcross): цикл по количеству слов(W, QChar(номер слова), QChar(длина слова), само слово).

2

xwicked, поддержу чем могу.

История показывает, что во всем новом обычно кроется какой-то подвох.
Классическая ошибка, которую совершают проектировщики
абсолютно надежных систем, - недооценка изобретательности клинических идиотов.

3

Продолжаем знакомиться с исходником. Профессиональный кроссворд, версии 0.1.4 - это объединение двух предыдущих: создателя и отгадывателя, с последующей доработкой.
Изменения:
- Добавлена возможность автоматического создания сетки кроссворда(бета-версия).
- Добавлена возможность автоматического составления кроссворда(выбор слов из словаря). Первая бета-версия.
- Присутствуют обе возможности(создание и отгадывыание).

Отмечу, что выбор слов происходит в один проход и могут быть пропуски слов в сетке, после составления кроссворда.

Исходный код + сборки(0.1.4) Отдельный проект на SourceForge.net - Клёст-кроссворд

В Клёст-кроссворде нет возможности сохранять пароль, в то время как в Crossword editor эта возможность есть. Проекты были разделены для большего удобства разработки.

P.S. Профессиональный кроссворд 0.1.7 = Клёст-кроссворд 0.1.7  smile

4

Следующая версия программы - 0.1.5. Исходный код + сборки.

Изменилась функция составления кроссворда, которая теперь позволяет заполнить всю сетку кроссворда словами.

5

xwicked пишет:

Структура файла - динамическая. Когда писал программы на Delphi - использовал статику - расходовалось лишнее дисковое пространство .

может просто использовать базу данных?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

6 (06.08.2011 14:36:20 отредактировано xwicked)

drBatty пишет:
xwicked пишет:

Структура файла - динамическая. Когда писал программы на Delphi - использовал статику - расходовалось лишнее дисковое пространство .

может просто использовать базу данных?

База данных используется для словаря. Для простого файла кроссворда это будет лишним. Особенно это заметно будет при множественном выборе с  экспортом(сохранением) в файл. SQLite возможно дольше будет работать в пределах разных транзакций(/ открытий закрытий файла базы данных).

А в Delphi я использовал запись и не знал, как сделать запись с изменяемыми размерами полей.

7

xwicked пишет:

SQLite возможно дольше будет работать в пределах разных транзакций(/ открытий закрытий файла базы данных).

да, вы видимо правы.

xwicked пишет:

А в Delphi я использовал запись и не знал, как сделать запись с изменяемыми размерами полей.

в смысле в БД?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

8

drBatty пишет:

...в смысле в БД?

Нет, я не уточнил  smile  . В Delphi я с БД не работал. Я имел в виду структура record.

9

Несколько мыслей косметического характера:
1. Может есть смысл сделать список последних открывавшихся файлов? (Готовое решение можно подсмотреть в Qt4: Программирование GUI на с++)
2. crossword.cpp   slotUserManual()

UserManual->start("/usr/games/xwcphelp ru");

Жестко на русский привязано

3. slotAboutProgram()
Для какой ОС сборка можно подставить проанализировав Q_WS_*

4. Жестко прописан путь

 int CrosswordPro::SaveCurrentLanguage(QString Language)
       {
            QFile file("/tmp/xwcp/settings.xws");
....
  QFile file("/tmp/xwcp/settings.xws");

                if(file.open(QIODevice::ReadOnly))

4. И почему для хранения настроек не использовали QSettings? Все уже готово. К тому же (если специально не попросить) класс хранит файл настроек в нативном для системы расположении, а так же отрабатывает если нет доступа в один каталог, пробует в другой и т.п. В асистенте это расписано....

5. Форматирование кода у мнея как то местами непонятно идет..... Вроде тот же блок, а отступ больше. Чтение кода затрдняется чуток.....
6. CrosswordToData(uchar State)

    if(State == 0)
                {
                }

            if(State == 1)
                {
                }

            if(State == 2)
                {
                }

State вроде не меняется внутри блоков. Зачем ее тогда три раза проверять? Делайте либо else if  либо switch
Кроме того числовые константы зло - используйте enum (имхо) .

7. вообще у вас все пути жестко прописаны от root -плохо

8. Со строками, имхо, лучше немного по другому работать
У вас примерно так

 str1 = QString("INSERT INTO %1 (Number) VALUES(%2);").arg(CurrentTable).arg(strNumber);
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

10

voral пишет:

...
1. Может есть смысл сделать список последних открывавшихся файлов? (Готовое решение можно подсмотреть в Qt4: Программирование GUI на с++)...

Это будет сделано, возможно в ближайших 3-х релизах. 10 последних открытых файлов.

voral пишет:

...
2. crossword.cpp   slotUserManual()

UserManual->start("/usr/games/xwcphelp ru");

Жестко на русский привязано...

Да, есть такое. Так как нет в архиве с исходником файла с английским руководством. Это я начал практиковать для сборки deb и rpm пакетов для будущих версий:

//Открытие руководства пользователя
       void KlestCrossword::slotUserManual()
       {
        #if defined(Q_WS_WIN)
            UserManual->start(QApplication::applicationDirPath() + "/help.exe");

        #elif defined(Q_WS_X11)
            if(actionRussian->isChecked() == true)
                UserManual->start("/opt/klest-crossword/klest-help ru");

            if(actionEnglish->isChecked() == true)
                UserManual->start("/opt/klest-crossword/klest-help en");

        #endif
       }

Поэтому обязательно я это сделаю и для остальных сборок.

voral пишет:

...
3. slotAboutProgram()
Для какой ОС сборка можно подставить проанализировав Q_WS_*
...

Я уже решил отказаться от этой возможности, так как не считаю необходимым сообщать пользователю, в какой он системе работает. Пусть и дальше думает, что у него Google Android  :lol:

voral пишет:

...
4. Жестко прописан путь

 int CrosswordPro::SaveCurrentLanguage(QString Language)
       {
            QFile file("/tmp/xwcp/settings.xws");
....
  QFile file("/tmp/xwcp/settings.xws");

                if(file.open(QIODevice::ReadOnly))

4. И почему для хранения настроек не использовали QSettings? Все уже готово. К тому же (если специально не попросить) класс хранит файл настроек в нативном для системы расположении, а так же отрабатывает если нет доступа в один каталог, пробует в другой и т.п. В асистенте это расписано....

Посмотрел на QSettings - постараюсь применить его уже в версии 0.3.1. Раньше я его разглядывал - решил, что слишком много лишнего. Сейчас же вижу, что есть там то, что мне особенно необходимо ab

voral пишет:

...
5. Форматирование кода у мнея как то местами непонятно идет..... Вроде тот же блок, а отступ больше. Чтение кода затрдняется чуток.....

Радуйтесь, что Вы не видели оригинал  ag - код форматируется после нескольких релизов - и большое значение этому не уделяется - последняя версия 0.2.9 - около 6000 строк. Одному это тяжело и времени много у меня нету.

voral пишет:

...
6. CrosswordToData(uchar State)

    if(State == 0)
                {
                }

            if(State == 1)
                {
                }

            if(State == 2)
                {
                }

State вроде не меняется внутри блоков. Зачем ее тогда три раза проверять? Делайте либо else if  либо switch
Кроме того числовые константы зло - используйте enum (имхо) . ...

Согласен - спешка была  smile Про константы - так, думаю, будет нагляднее.

voral пишет:

...
7. вообще у вас все пути жестко прописаны от root -плохо...

С применением QSettings - должно всё нормализоваться.

voral пишет:

...
8. Со строками, имхо, лучше немного по другому работать
У вас примерно так

 str1 = QString("INSERT INTO %1 (Number) VALUES(%2);").arg(CurrentTable).arg(strNumber);

Я посчитал этот способ неособо наглядным.

Благодарю за советы. Плюсанул.

11

В новой версии 0.1.6 - исходник + сборки, добавлен экспорт кроссворда в изображения следующих растровых графических форматов: JPG, JPEG, BMP, TIFF, PNG, XPM, XBM, PPM + несколько других исправлений.

12

Разговоры про отступы и QtCreator поехали в разговоры http://linuxforum.ru/viewtopic.php?id=15699

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

13

А вот и новая версия 0.1.7. Изучаем сборки + код.

Что изменено:

- Временное название "Профессиональный кроссворд" изменено на "Клёст-кроссворд".
- При вводе слова в кроссворд, производится проверка на количество введённых букв в поле "Введите слово".
- В свойствах таблицы кроссворда отключена возможность ввода букв, непосредственно в ячейку, минуя поле "Введите слово".
- Изменены цветовые стили некоторых компонентов.
- В строку состояния добавлен компонент, отображающий количество букв.
- Добавлена проверка состояния сохранения изменений, произведённые в кроссворде, при выходе, используя меню "Кроссворд->Выход".

14

xwicked пишет:

- Добавлена проверка состояния сохранения изменений, произведённые в кроссворде, при выходе, используя меню "Кроссворд->Выход".

Видимо вы сделали для этого специальный флаг. Между тем у QMainWindow есть интересные методы

bool    isWindowModified () const
void    setWindowModified ( bool )

А если вы заголовок зададите примерно так

setWindowTitle(tr("Кроссворд: [*] - %1").arg(filename));

То когда будете ставить setWindowModified (true); в заголовке будет видна звездочка, если в false - то она будет автоматом оттуда исчезать

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

15

voral пишет:

...Видимо вы сделали для этого специальный флаг. Между тем у QMainWindow есть интересные методы

bool    isWindowModified () const
void    setWindowModified ( bool )

А если вы заголовок зададите примерно так

setWindowTitle(tr("Кроссворд: [*] - %1").arg(filename));

То когда будете ставить setWindowModified (true); в заголовке будет видна звездочка, если в false - то она будет автоматом оттуда исчезать

Думаю, что это не будет использоваться:

            connect(TableCrosswordPro, SIGNAL(cellChanged(int,int)), SLOT(slotCellChanged()));
       bool SaveStateCross,//Состояние сохранения кроссворда
            SaveStateTemplate,//Состояние сохранения шаблона
            SaveStateTemporary,//Состояние сохранения отгаданных слов
//При изменении сетки
       void CrosswordPro::slotCellChanged()
       {
           if(gRegimeViewing == false)
               {
                   SaveStateCross = false;
                   SaveStateTemplate = false;
               }
           else SaveStateTemporary = false;
       }

Важно только изменение сетки(таблицы) кроссворда.

16

Если у кого-нибудь будет желание свою изменённую версию кроссворда далее распространять, то для этой цели я подготовил спекфайл для сборки программы в дистрибутиве ОС Linux, основанного на RPM-пакетах.
Также прошу найти в нём ошибки:

Summary: Qt program for professional creating and easy guessing the classic crossword puzzles.

Summary(ru): Qt программа для профессионального создания редактирования и лёгкого отгадывания классических кроссвордов

%define version 0.1.7

Group: Games/Puzzles

Name: klest-crossword

BuildRequires: gcc-c++, libqt4-sql-sqlite >= 4.4.3, libqtgui4 >= 4.4.3, libqt4-core >= 4.4.3

BuildArch: %ix86

Provides: klest-crossword

Release: alt1

Source: klest-crossword-%{version}.tar.gz

Url: http://labfreetech.org/index_e.html

Version: %{version}

License: GPLv2

Packager: LabFreeTech.org admin@labfreetech.org

%description
Qt program for creating and guessing the classic crossword puzzles.
Supported features: - Create a crossword puzzle; - Editing a crossword puzzle; - Guessing crossword puzzle; - Check correctness of guessing a crossword puzzle; - Save state incompletely guessed crossword puzzle; - Automatic creation of crossword puzzle grid (beta) - Automatic selection of words from the dictionary (Beta 2); - Adding / removing words from the dictionary; - Conservation created a crossword puzzle grid, as a template for the new; - Editing the font crossword; - Editing the size of the grid cell crossword puzzle; - Export crossword in the image.

%description -l ru
Qt программа для профессионального создания редактирования и лёгкого отгадывания классических кроссвордов
Поддерживаемые функции: - Создание кроссворда; - Редактирование кроссворда; - Отгадывание кроссворда; - Проверка правильности отгадывания кроссворда; - Сохранение состояния неполностью отгаданного кроссворда; - Автоматическое создание сетки кроссворда(бета); - Автоматический выбор слов из словаря(бета 2); - Добавление/удаление слов из словаря; - Сохранение созданной сетки кроссворда, как шаблон для нового; - Редактирование шрифта кроссворда; - Редактирование размера ячейки сетки кроссворда; - Экспорт кроссворда в изображение.

%prep

%setup -q

%build
%make_build

%install

cp -Rv klest/ %buildroot/

%clean

rm -rf $RPM_BUILD_ROOT

%files

/usr/games/*
/usr/share/*

%post

test -e /usr/bin/klest-crossword-0.1.7 || ln -s /usr/games/klest-crossword-0.1.7 /usr/bin/klest-crossword-0.1.7
test -e $HOME/Desktop/klest-crossword.desktop || cp -r /usr/share/applications/klest-crossword.desktop $HOME/Desktop/klest-crossword.desktop

%postun

test -L /usr/bin/klest-crossword-0.1.7 && rm -r /usr/bin/klest-crossword-0.1.7
test -e $HOME/Desktop/klest-crossword.desktop && rm -r $HOME/Desktop/klest-crossword.desktop

Специальный архив версии 0.1.7.
Устанавливаем дополнительный пакет rpm-build и собираем командой в консоли:

$rpmbuild -bb /home/username/RPM/SPECS/klest-crossword-0.1.7-alt.spec

17

Продолжение: 0.1.8. Исходный код + сборки.

Изменения:

- Изменился алгоритм выбора слов из словаря(бета 3), с небольшой оптимизацией;
- Исправлена ошибка при экспорте кроссворда в изображение;
- Изменилось автоматическое переключение между направлением слов, на ручное - щелчком правой кнопки мыши.

18

Здравствуйте!

Хочу порадовать Вас тем, что я сделал дополнительный архив исходного кода, для сборки программы в ОС GNU / Linux Debian( / Ubuntu).
Для сборки deb-пакета необходимо наличие установленных пакетов: autotools-dev, dh-make, fakeroot, cdbs, dpkg, dpkg-dev и другие.
Команда сборки:

user@pc:/klest-crossword-0.1.9-deb$ dpkg-buildpackage -rfakeroot

Для проверки правильности соответствия стандартам дистрибутива Debian, используйте пакет Lintian.

Исходный код + сборки: 0.1.9.

Что нового:

- Исправлена фатальная ошибка, возникающая при отсутствии словаря.
- Исправлена фатальная ошибка, возникающая когда заканчиваются слова в словаре.
- Добавлена возможность несимметричного ручного редактирования сетки кроссворда.
- Изменён режим работы программы по умолчанию на режим просмотра.

19

Следующая версия = 0.2.0.

Исходный код + сборки: 0.2.0.

Важное изменение: добавление значков Oxygen. Ещё добавлены 2-а новых словаря: русский на 31 000 слов и английский на 41 000 слов. Теперь программа выглядит вот так -
http://labfreetech.org/poster.gif

Произведённые изменения:

- Добавлены значки "Oxygen", распространяемые по лицензии GNU GPL;
- Исправлена ошибка экспорта кроссворда в изображение форматов JPG, JPEG, TIFF;
- Добавлена возможность выбора словаря для составления кроссворда. Возможные варианты: русский и английский;
- Изменена стандартная панель - добавлены несколько новых действий, исправлены ошибки;
- Изменён формат файла свойств программы, в сторону более простого добавления в него будущих свойств.

20

Судя по тому, что вы приводите куски кода (да и в заголовке есть "обсуждение кода") вы рассчитываете на то, что с вашим кодом будут работать другие.
Так вот ваш код совершенно не подходит для командной работы, более того на месяц отвлечетесь от проекта и сами будете спотыкаться. И чем  дальше вы будете это оставлять как есть тем сложнее будет в последствии. К примеру берем main.cpp

if(ListParameters.at(0) == "editing" && ListParameters.at(1) =="english") Settings = 0;
if(ListParameters.at(0) == "editing" && ListParameters.at(1) =="russian") Settings = 1;
if(ListParameters.at(0) == "viewing" && ListParameters.at(1) =="english") Settings = 10;
if(ListParameters.at(0) == "viewing" && ListParameters.at(1) =="russian") Settings = 11;

Смешали две разных характеристики в одну переменную с ни чего не говорящим названием.
Идем дальше

switch(Settings)
             {
                 case 0:
                     FormKlestCrossword.actionEditing->setChecked(true);
                     FormKlestCrossword.actionEnglish->setChecked(true);
                     FormKlestCrossword.actionViewing->setChecked(false);
                     FormKlestCrossword.actionRussian->setChecked(false);
                     FormKlestCrossword.slotRegimeEditing();
                 break;

                 case 1:
                     FormKlestCrossword.actionEditing->setChecked(true);
                     FormKlestCrossword.actionEnglish->setChecked(false);
                     FormKlestCrossword.actionViewing->setChecked(false);
                     FormKlestCrossword.actionRussian->setChecked(true);
                     FormKlestCrossword.slotRegimeEditing();
                 break;

                 case 10:
                     FormKlestCrossword.actionEditing->setChecked(false);
                     FormKlestCrossword.actionEnglish->setChecked(true);
                     FormKlestCrossword.actionViewing->setChecked(true);
                     FormKlestCrossword.actionRussian->setChecked(false);
                     FormKlestCrossword.slotRegimeViewing();
                 break;

                 case 11:
                     FormKlestCrossword.actionEditing->setChecked(false);
                     FormKlestCrossword.actionEnglish->setChecked(false);
                     FormKlestCrossword.actionViewing->setChecked(true);
                     FormKlestCrossword.actionRussian->setChecked(true);
                     FormKlestCrossword.slotRegimeViewing();
                 break;
             }

Если я давно не видел код приведенный в первой цитате. То творящееся здесь будет неким ребусом (разгадываемым, но на фига козе баян)
Анализируем какуюто переменную сетингс. Фиг с ней пусть будет что то  связано с настройкой. Если она равно: 0, 1, 10, 11..... брррр надо лезть узнавать, что за 11.

Почему место первой цитаты не сделать

    enum {lgRus,lgEng} lang;
    enum {mdEdit,mdView} mode;

    lang = (ListParameters.at(1) =="english") ? lgEng : lgRus;
    mode = (ListParameters.at(0) =="editing") ? mdEdit : mdView;

Хотя и это даже не нужно..... В main.cpp анализируется режим редактирования или просмотра 4 раза в LoadSettings() и в двух кейсах; язык
2 раза в  LoadSettings(), в двух кейсах и одном условии. Нафига? А если в сеттингсах будет опечатка? Тогда вообще словишь черте что

Вот так вот было бы может более красиво

QStringList LoadSettings()
{
     QFile file("/tmp/klest-crossword/settings.xws");
     QStringList ListParameters;

     if(file.open(QIODevice::ReadOnly))
     {
         QDataStream stext(&file);
         stext >> ListParameters;
     }

    file.close();
    return ListParameters;
}


int main(int argc, char *argv[])
{
     QApplication app(argc, argv);

     QString CurrentLanguage, CurrentRegime;
     QDir tempDir("/tmp/klest-crossword");
     tempDir.mkdir(tempDir.path());//Создание временной папки

     QStringList Settings = LoadSettings();
     QTranslator tr1, tr2, tr3, tr4, tr5, tr6, tr7;

     KlestCrossword FormKlestCrossword;

     if(argc == 2)
     {
         FormKlestCrossword.FileNameCrossword = argv[1];
         FormKlestCrossword.slotOpen(true);
     }

     FormKlestCrossword.SaveStateCross = true;
     FormKlestCrossword.SaveStateTemplate = false;
     FormKlestCrossword.SaveStateTemporary = true;

     if (Settings.at(0).compare("editing",Qt::CaseInsensitive)==0)
     {
         CurrentRegime = "editing";
         // по умолчанию чекбоксы не активированы в false устанавливать не надо
         FormKlestCrossword.actionEditing->setChecked(true);
     }
     else
     {
         CurrentRegime = "viewing";
         FormKlestCrossword.actionEnglish->setChecked(true);
     }
     if (Settings.at(0).compare("russian",Qt::CaseInsensitive)==0)
     {
         CurrentLanguage = "russian";
         FormKlestCrossword.actionRussian->setChecked(true);
         tr1.load("/usr/share/klest-crossword/languages/Russian/KlestCrossword_ru.qm", ".");
         tr2.load("/usr/share/klest-crossword/languages/Russian/KlestCrossword.ui_ru.qm", ".");
         tr3.load("/usr/share/klest-crossword/languages/Russian/InputParametrTableCrossword.ui_ru.qm", ".");
         tr4.load("/usr/share/klest-crossword/languages/Russian/Dictionary_ru.qm", ".");
         tr5.load("/usr/share/klest-crossword/languages/Russian/TemplateCrossword.ui_ru.qm", ".");
         tr6.load("/usr/share/klest-crossword/languages/Russian/Dictionary.ui_ru.qm", ".");
         tr7.load("/usr/share/klest-crossword/languages/Russian/About.ui_ru.qm", ".");
     }
     else
     {
         CurrentLanguage = "english";
         FormKlestCrossword.actionEnglish->setChecked(true);
     }
     app.installTranslator(&tr1);
     app.installTranslator(&tr2);
     app.installTranslator(&tr3);
     app.installTranslator(&tr4);
     app.installTranslator(&tr5);
     app.installTranslator(&tr6);
     app.installTranslator(&tr7);

     FormKlestCrossword.show();
 
     return app.exec();
}

А вот этому:

     FormKlestCrossword.SaveStateCross = true;
     FormKlestCrossword.SaveStateTemplate = false;
     FormKlestCrossword.SaveStateTemporary = true;

не было бы более логичным оказаться в конструкторе?

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

21

Компилируем - запускаем:

 Консоль:

Object::connect: No such slot KlestCrossword::ListEditRow()
Object::connect:  (sender name:   'ListQuestions')
Object::connect:  (receiver name: 'KlestCrossword')

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

22

О программе переделали... гуд. Но где ж дейстующие ссылки? Юзайте html, все странички отправьте ресурсы, а на форме оставьте вместо четырех полей один QWebView. B загружай нужный в соответствии с вкладкой. А дальше:

browser->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
connect(browser,SIGNAL(linkClicked(QUrl)),this,SLOT(openLink(QUrl)));
......

void About::openLink(const QUrl & url )
{
    QDesktopServices::openUrl(url);
}
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

23

Расширения стандартных файлов приложения прописаны живьем по всему проекту. То же не гуд. Работа с файлом настроек раскидана по проекту......

"Ты только не обижайся, но я тебе один умный вещь скажу" (с) Мимно

Не гоните сейчас версии трех разных программ. Притормозите и приведите проекты в порядок.

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

24

voral, со всем в принципе я согласен. Прокомментирую некоторые моменты:
- Свойства, цифры, смешение и main.cpp - нужно чуть изменить и сделать в одном месте загрузку, в другом  сохранение.
- коннект ListEditRow() тоже удалю
- Использовать QWebView ради кликабельных ссылок глупо. Должен быть другой способ. Чтобы не добавлять пока новых библиотек к Win и Mac версиям в сборки.
- Живые расширения можно закопать в константы, будет небольшая экономия

voral пишет:

...
"Ты только не обижайся, но я тебе один умный вещь скажу" (с) Мимно
Не гоните сейчас версии трех разных программ. Притормозите и приведите проекты в порядок.

Текущая дата 18.08.2011. Данные Cahngelog'ов:
Тест - Версия 0.4.4 (10.05.2011);
Кроссворд - Версия 0.2.9 (18.02.2011);
Библиотека - Версия 0.1.9 (02.01.2011);
-------------------------
Это уже большуууууууший тормоз. Для этого я и пришёл на форум. Потом все комменты соберу - будет новый хороший релиз каждой программы.

Благодарю за советы ab

25

xwicked пишет:

- Использовать QWebView ради кликабельных ссылок глупо. Должен быть другой способ. Чтобы не добавлять пока новых библиотек к Win и Mac версиям в сборки.

    QTextBrowser *br = new QTextBrowser(this);
    br->document()->setHtml("<a href=\"ya.ru\">ya</a><br><a href=\"http://google.ru\">google</a>");
    br->setOpenExternalLinks(true);

bx

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

26 (25.08.2011 18:59:00 отредактировано xwicked)

voral пишет:
xwicked пишет:

- Использовать QWebView ради кликабельных ссылок глупо. Должен быть другой способ. Чтобы не добавлять пока новых библиотек к Win и Mac версиям в сборки.

    QTextBrowser *br = new QTextBrowser(this);
    br->document()->setHtml("<a href=\"ya.ru\">ya</a><br><a href=\"http://google.ru\">google</a>");
    br->setOpenExternalLinks(true);

bx

Этот способ пока что не пойдёт.
-----------------------------------------------
Программа доведена до стабильности. Релиз 0.2.1. Исходник + сборки.

Все изменения:

- Исправлена фатальная ошибка, возникающая при повторном автоматическом выборе слов, после автоматического создания сетки;
- Исправлена ошибка алгоритма выбора слов из словаря;
- Исправлена ошибка автоматической вставки слов в сетку кроссворда;
- Исправлена ошибка неправильного ввода слова в сетку кроссворда, при повторных нажатиях на кнопку "ОК";
- Исправлена ошибка экспорта в изображения, при ручном создании кроссворда;
- Исправлена ошибка передачи текущего шрифта в диалог выбора шрифта, при его открытии;
- Оптимизирован алгоритм автоматического создания сетки кроссворда;
- Оптимизирован алгоритм автоматического выбора слов из словаря;
- Оптимизированы алгоритмы: создания, изменения, сохранения, открытия, закрытия кроссворда;
- Изменён формат файла кроссворда и формат файла сохранения состояния неполностью отгаданного кроссворда;
- Для повышения интереса к игровому процессу, после проверки правильности отгадывания, кроссворд закрывается.

27 (03.09.2011 23:58:04 отредактировано xwicked)

А в новой версии 0.2.2 я реализовал импорт кроссворда из текстового формата AcrossLite первой версии. Вторая версия будет загружаться, но за исключением дополнительной головоломки.

Что нового:

- Появилась возможность импортировать кроссворд, из текстового формата AcrossLite;
- Исправлена фатальная ошибка, не позволяющая создавать кроссворды больше чем 18х18;
- В меню "Помощь" добавились пункты: "Пожертвовать" и "Получить исходный код";
- Сохранение состояния неполностью отгаданного кроссворда AcrossLite(TXT) имеет своё расширение, при оставленной той же структуре файла;
- В окне о программе все ссылки изменили свой цвет на синий, для удобства поиска;
- Появилась возможность вводить слово в сетку кроссворда, нажатием на клавишу "Ввод".

Дабы быть уверенным в том, что файлы не побились, при закачке, я добавил текстовик с md5-контрольными суммами.
Git-репозиторий:

git://klest-crossword.git.sourceforge.net/gitroot/klest-crossword/klest-crossword (read-only)

28

Здравствуйте!

- Добавлена возможность полуавтоматического ввода слов из словаря;
- Добавлена возможность печати кроссворда;
- Добавлены горячие клавишы;
- Увеличен максимальный размер кроссворда до 999х999х999(столбцы/строки/размер ячейки);
- Во избежании ошибки, теперь после отмены выбора слов нельзя сделать экспорт в изображение;
- После отладки, возвращено автоматическое определение направления слов при выделении, убранное в версии 0.1.8;
- Добавлена возможность ввода имени игрока;
- Добавлена статистика;
- Исправлена ошибка неисчезновения пунктов меню автоматизации, в режиме просмотра;
- Исправлена ошибка, при ручном вводе слов в кроссворд;
- Добавлен пункт меню "Получить техподдержку";
- Некоторые окна теперь не разворачиваются на весь экран по-умолчанию. Изменились также размеры нескольких окон.

В новой версии 0.2.7 Появилась возможность печати кроссворда. Хочу обратить особое внимание на тестирование этой функции, так как у меня дома нету принтера. Очень интересно, как ведёт себя печать на разных принтерах под всеми ОС.
Полуавтоматический ввод слов позволит создавать тематические кроссворды и задавать различную сложность, при составлении.

P.S. Ещё один очень важный момент: версии 0.2.7, 0.2.8 - сборки являются минимальными. То есть, чтобы посмотреть на все функции, необходимо программу собрать из исходника . Это делалось для проверки аудитории пользователей на заинтересованность в программе, путем отправки мне запроса на получение исходного кода. Что было не очень удачной идеей и, с версии 0.2.9, сборки программы уже снова полнофункциональны. Прошу извинить меня за данное неудобство :o .

29

В версии 0.2.8 я добавил функции горизонтального и вертикального отражения кроссворда как изображения. Так же добавил инверсию цветов ячеек сетки кроссворда. Но... я не смог быстро придумать функцию обрезания сетки кроссворда, если он, например, получился меньше созданных рамок. Интересует самое простое решение данного вопроса. Благодарю!

Ещё изменения:

- Добавлена возможность рисования сетки, как карандашом;
- Добавлена функция автоматического создания, сохранения и экспорта неограниченного числа кроссвордов из одного шаблона по нажатии одной клавиши, предварительно установив соотвествующие настройки;
- Добавлены функции очистки слов, сетки и всего кроссворда;
- Добавилось окно "Параметры";
- Выбор словаря перенесён в окно "Параметры";
- Добавлена возможность выбора папки, из которой будут показываться шаблоны, для последующего их использования;
- Добавлена возможность задания пути для экспортируемого изображения в окне "Параметры";
- Добавлена возможность задания папки для экспорта вопросов и ответов в окне "Параметры";

30

xwicked пишет:

Но... я не смог быстро придумать функцию обрезания сетки кроссворда, если он, например, получился меньше созданных рамок. Интересует самое простое решение данного вопроса. Благодарю!

Это про отражение? Вы надеюсь используете QGraphicsScene и компанию? (там вроде как и задумываться не надо)
А си про сам кроссворд - зачем обрезать? Либо масштабировать - либо прорутку делать.

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian