Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gil9red от Мая 30, 2012, 15:47



Название: [РЕШЕНО] Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 15:47
Здравствуйте, форумчане! :)
Мне как любителю игры судоку, захотелось написать ее)
только в разработке форм приложений я знаю самые основы: компоновщики, сплитеры, различные виджеты и т.д.
А вот контролировать поведение отдельного виджета, помещенного скажем в компоновку я и не представляю.

Написал небольшой пример, создающий поле судоку, в качестве ячеки взял push button:
Код:
    const short N = 9;
    QGridLayout *gridBoard = new QGridLayout();
    QPushButton *cell[N][N];

    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
        {
            cell[i][j] = new QPushButton();
            cell[i][j]->resize(40, 40);
            gridBoard->addWidget(cell[i][j], i, j);
        }

    QWidget *sudokuBoard = new QWidget();
    sudokuBoard->setLayout(gridBoard);
Все работает, только вот кнопки получаются не квадратными, можно было конечно зафиксировать их размер, но и это не годится - хотелось бы чтобы они могли пропорционально увеличиваться/уменьшать, если размер окна менялся.

Кроме этого расстояние между кнопками слишком большое, и хотелось бы чтобы как в судоку это поле можно было разделить на 9 квадратов, в каждом по 9 ячеек, и чтобы было небольшое расстояние между этими квадратами.

Теперь перейду к сути написания темы:
Подскажите/покажите как лучше и удобнее решить эту задачу: :) (Какие виджеты лучше использовать для создания поля, какие в качестве ячеек и т.д. и т.п.)

и убедительная просьба:
не надо писать чтобы воспользовался поиском на сайте - уже делал ;D


Название: Re: Программная разработка доски Судоку
Отправлено: mutineer от Мая 30, 2012, 16:00
Кроме этого расстояние между кнопками слишком большое, и хотелось бы чтобы как в судоку это поле можно было разделить на 9 квадратов, в каждом по 9 ячеек, и чтобы было небольшое расстояние между этими квадратами.

вот это попробуй
http://doc.crossplatform.ru/qt/4.7.x/html-qt/qgridlayout.html#setSpacing


Название: Re: Программная разработка доски Судоку
Отправлено: Alatey от Мая 30, 2012, 16:15
Вот мой "рагульский" способ, зато рабоооочий ;D
Код:
class Forma: public QWidget
{
    Q_OBJECT
    ...
protected:
    void resizeEvent(QResizeEvent *event); // перекрываешь виртуальный метод в классе формы
};

void Forma::resizeEvent(QResizeEvent *event)
{
    // я так вручную выравнивал элементы при изменении размеров формы
    int width = event->size().width();
    int height = event->size().height();

    // tab 0
    QRect rect = this->ui->tabWidget->geometry();
    this->ui->tabWidget->setGeometry( rect.x(), rect.y(), width - 2, height - 35);

    // tab 1
    rect = this->ui->lineEdit_CurrentTariffRevenues->geometry();
    this->ui->lineEdit_CurrentTariffRevenues->setGeometry( rect.x(), rect.y(), width - 272, rect.height());
}


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 17:02
Я бы посоветовал QTableView для вашей задачи.

Гораздо удобнее и сам следит за необходимыми вам ресайзами.

Другой вопрос, что я судоку не интересуюсь и возможно, что недопонимаю ваше желание сделать 300 виджетов вместо 1.


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 17:16
Alatey, спасибо что напомнили о том что есть возможность переопределить событие изменения размера виджета)

Знаете, Bepec я с QTableView и с самими таблицами в qt очеень мало работал: только для отображения таблицы после отправления запроса в sql и все! И если бы вы показали код в котором QTableView помог бы в решении моей проблемы было бы очень хорошо :) Да и на наглядном примере лучше понимается :D


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 17:19
Я вот не знаю, а можно сделать так, чтобы для отдельной ячейки таблицы можно было выбрать цвет/картинки??


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 30, 2012, 17:32
можно


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 17:36
можно
kambala, а как?? :) :)


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 17:39
Просто возьми таблицу. Тот же эксцель.

Та же самая QTableView. В каждой ячейке можно хоть попа, хоть картинку, хоть цвет другой. Можно с лёгкостью (или с трудом) даже дисплей на нём сделать. И над каждой ячейкой хозяин - ТЫ :D

Как - делегаты или переопределённый *::data(*) в модели.

PS выложи картинку, чего ты хочешь сделать. А то я не оч соображаю твою хотелку ;)


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 17:49
(http://www.sudokuweb.ru/img/random.png)
Хочу сделать что то вроде такого =)


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 18:05
Учитывая советы которые мне дали сделал следующее:

Код:
    const short N = 9;

    QTableView *tableView = new QTableView();

    QTableWidget *table = new QTableWidget;
    table->setRowCount(N);
    table->setColumnCount(N);

    tableView->setModel(table->model());

    tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    tableView->verticalHeader()->hide();
    tableView->horizontalHeader()->hide();

    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
        {
            tableView->setRowHeight(i, 40);
            tableView->setColumnWidth(j, 40);
        }

    QWidget *window = new QWidget();
   
    QVBoxLayout *mainVLayout = new QVBoxLayout();
    mainVLayout->addWidget(tableView);
   
    window->setLayout(mainVLayout);
    window->show();

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


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 18:08
Код:
for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
        {
            tableView->setRowHeight(i, 40);
            tableView->setColumnWidth(j, 40);
        }


Ты сам им не даёшь менять размер :) А так они милые и очень послушные ;)


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 18:12
Bepec, я просто указал их начальный размер, а не фиксированный :)
и если и убрать этот цикл, то ячейки просто станут прямоугольными но при этом ничего не изменится  :(


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 18:25
Виновен :D Я :) Нерассмотрел начальный.

Переопредели resizeEvent. Там и проведи нехитрый рассчёт величины ячеек. Но тут одна дилемма. Или растягивать пропорционально, либо динамически (а динамически очень некрасиво).


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 18:32
Как то уж мудренно выглядит :(
не очень хочется делать наследование, потом переопределение...
жаль что в этом классе нет метода, который бы сам делал resize таблицы и ячеек :)


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 18:56
Похоже, если я захочу закрашивать или прикреплять картинку к отдельную ячейке, придется переопределять paintEvent, или делать делегат


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 19:15
Народ, а в чем тут ошибка??
Код:
    
QTableWidgetItem *item = table->item(0, 0);
item->setText("");

при выполнение этого кода происходит ошибка, не при компиляции


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 19:18
Вы неверно судите. И по сложности, и по перекрашиванию ячейки и делегату )
Достаточно просто отдать картинку в data  и он её сам отобразит как бэ.

Вы думаете разработчики Qt делали этот класс для отрисовки судоку ? :)

Ахз где у вас тут ошибка. Вы лучше проект скидывайте, а не огрызки :)


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 30, 2012, 19:34
да память там не выделена для элемента скорее всего. проверь элемент на равенство 0.


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 20:22
Bepec вот:
Код:
    QTableWidget *table = new QTableWidget;
    table->setRowCount(9);
    table->setColumnCount(9);

    QTableWidgetItem *item = table->item(1, 1);
    item->setText("");


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 30, 2012, 20:23
говорю же - память под элемент не выделена. предлагаю почитать документацию к QTableWidget.


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 20:24
Вы сейчас пытаетесь в несуществующий первый элемент запихнуть пустую строку.
Как думаете, у вас получится? :)


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 20:30
Конечно нет ;D
Я и сам понял, что при компиляции проблем не возникло - значит дело с указателями и выделенной памяти :)
только каким макаром можно получить доступ к элементу table?

или создать 81 объектов QTableWidgetItem, поместить их в table?

может было бы проще в качестве ячеек использовать виджет?
например label
или скажем создать что нибудь свое:
делаем виджет с 9-ю элементами, наследуем от QWidget, эти элементы
объедиены в layout?


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 30, 2012, 20:56
в двойном цикле выделить память под все элементы таблицы, потом нужным выставить значение в индивидуальном порядке


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:04
kambala, разумно :)


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:08
И все же меня беспокоит то каким сделать эту игру, что лучше - использовать table или самому, вручную сделать написать нужный для этого код? :(
Хочется выбрать тот способ, что был бы и прост и элегантен, не хотелось бы устраивать шаманские пляски :)


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 30, 2012, 21:12
через таблицу будет проще. "самому вручную" придется много рисовать через QPainter.


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:15
kambala, я последую вашему совету :)


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 30, 2012, 21:19
Я бы рекомендовал как раз через ручную отрисовку поработать. Самое то, чтобы обучаться на практическом примере.


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 30, 2012, 21:20
а через таблицу здесь делать.. это как зуб через попу удалять, имхо :)

P.S. - когда-то ради прикола делал "аля сокобан (http://gallery.ufna.ru/content/Old/Games/game_koloboxer.jpg)" как раз таким методом, при этом много о Qt для себя открыв


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:26
ufna, красиво выглядит :)
groupbox полно=) если не ошибаюсь и для поля игры тоже groupbox используется)
точнее, поле игры внутри groupbox находится)
и поле создается через переопределенный paintEvent?)


Название: Re: Программная разработка доски Судоку
Отправлено: Igors от Мая 30, 2012, 21:30
Никогда не слышал о такой игре. Но тоже против таблицы - она хороша когда кол-во ячеек переменно и/или непредсказуемо. А если их число жестко фиксировано (и относительно невелико) - то массив/контейнер указателей на виджеты - и вся любовь.


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:35
Igors, и размещать эти самые виджеты с помощью layout?


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:45
Вы меня запутали  ???
Дело в том что генератор карт для этой игры у меня есть - это самое сложное в этом проекте, осталось сделать интерфейс - самое простое, относительно этого генератора, и хочется выбрать самый простой работающий способ :)


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 30, 2012, 21:47
ufna, красиво выглядит :)
groupbox полно=) если не ошибаюсь и для поля игры тоже groupbox используется)
точнее, поле игры внутри groupbox находится)
и поле создается через переопределенный paintEvent?)

поле игры рисуется целиком вручную в пейнт эвенте, включая "рамочку". Групбоксы там только для меню.


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 30, 2012, 21:57
Понятно, но если делать вручную судоку то при рисовании поля проблем не возникнет, зато далее будет очень весело: нажатую ячейку нужно выделить, для этого поле разделяем в виде сетки, отлавливаем куда тыкнул пользователь, зная координаты, выясняем на какую ячейку он попал, потом можно и нужно для ячейки подобрать значение (в судоку каждая ячейка имеет значение от 1-9), значит тоже самое что и с определением ячейки по координатам. Если мы захотим изменить размер окна, тут будет проще - используя метод scale() рисовальщика, и зная ширину/высоту окна, можем это осуществить :)
Но я не сторонник самоистезаний, если есть другой путь, хотя и сам не уверен, что другой путь приведет к цели, но этот способ гарантирует полный контроль над полем и возможность сделать на нем все что придумается :)


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 30, 2012, 22:01
Ну вообще-то все выше перечисленные вещи делаются за час, а если ранее не делал - то часа может за три, зато опыта - сразу гуд :) там еще вопросы некоторые есть которые всплывут ))

а так есть еще GVC  ::)

но на самом деле.. см. ответ Igors. делай виджеты, накидай их на лейаут и все. Самый быстрый и грубый путь.


Название: Re: Программная разработка доски Судоку
Отправлено: Igors от Мая 30, 2012, 22:05
Igors, и размещать эти самые виджеты с помощью layout?
А чего нет?

..зато далее будет очень весело: нажатую ячейку нужно выделить, для этого ..
Да, есть такие заботы, но они не так уж велики, рисовать все одном paint имеет свои преимущества.


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 30, 2012, 22:31
Блин >.<

Какие все умные. Вроде и QPainter с полной отрисовкой приплели.
Да ещё и посоветовали виджетов накидать тупо(штук 200/300 получится).

Вот этого я не понимаю. Чем плох TableView?

По отрисовке - тот же самый QPainter.
По скорости изменения (допустим перемещение ячеек и прочая) гораздо быстрее и удобнее самописного паинтера.
200-300 виджетов - а памяти у вас мало скушается? Или много? Или без разницы?

Помоему View (любой) как раз подходит для этих целей. Вручную отрисовывать конечно хорошо, но... В любом случае у вас получится model-view, который будет брать данные  и отрисовывать в соответствии.

И тут уже вопрос гибкости встаёт. Камбала же вроде за гибкость (по теме "MoveToThread" сужу).
Гибкости со своим Паинтером - никакой. Каждая правка - правка всей структуры. К тому времени уже запутанной.
А придёт всё к чему? К разделению отрисовки и данных. Вот и model-view.

PS
Цитировать
"Но тоже против таблицы - она хороша когда кол-во ячеек переменно и/или непредсказуемо. А если их число жестко фиксировано (и относительно невелико) - то массив/контейнер указателей на виджеты - и вся любовь."
- Ответь Igors пожалуйста на вопрос, что лучше - 200-300 виджетов в группе, или 1 model-View?


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 30, 2012, 23:09
Камбала же вроде за гибкость (по теме "MoveToThread" сужу).
я в темах про потоки вообще не пишу (или в этой писал?..). а тут я за таблицу как за доступное решение "из коробки".


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 30, 2012, 23:16
9х9 вроде как 81 виджет, откуда 200-300?

отрисовка в пеинтере имеет свои плюсы, не всегда модел/вью "встроенные" подходят. Но это уже для отдельной темы разговор.


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 06:51
2ufna - Для познавательной работы с Qt нужен и painter и model-View.

К сожалению я про судоку знаю мало. Там разве поле не может быть больше?

Цитата: Википедия
В последнее время появились модификации большего размера, чем 9 на 9 клеток. Например, существуют судоку с размерами 12×12 или даже 16×16, предназначенные для опытных игроков.

Table гибче и манёвреннее. Можно на лету менять. И самое то на таком примере изучить Model-View. А уж потом оно точно пригодится ;)


Название: Re: Программная разработка доски Судоку
Отправлено: Krysk от Мая 31, 2012, 08:25
Я помню на Qt3 текстовый редактор делал каждую буковку сам отрисовывал, а также: выделение, подсветка синтаксиса и п.р... собственный QTextEdit;)

Сейчас я предпочитаю использовать qml + QGraphicsScene жаль что нокиа тормозят c qt ведь кодить на qml в 100500 раз дешевле и проще чем с хмл + java в том же андроид :(


Название: Re: Программная разработка доски Судоку
Отправлено: Igors от Мая 31, 2012, 08:45
Ответь Igors пожалуйста на вопрос, что лучше - 200-300 виджетов в группе, или 1 model-View?
Model-view это всего лишь разделение UI и структур данных. Это можно обеспечить и с массивом виджетов и с рисованием в paint. Не вижу что выигрывается при таблице если данные статичны - наоборот, забот только больше. Хотя впрочем - дело вкуса


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 08:59
Я как то попробовал создать таблицу в 400 на 400 ячеек и групбокс 400 на 400 label. Лейблы тормозили ужасно. Таблица спокойно работала.
Model-View не только разделение ui. Там получается 1 виджет (ну пусть 3), с параметрами отображения. А 200-300 виджетов со всеми их параметрами и характеристиками и ненужными в данном случае возможностями проигрывают во всём. Скорости отображения, занимаемой памяти и прочему.

Я бы сказал, что выбор у автора (если он хочет) есть между painter'ом и Model-View. И в том, и в этом случае получится model-View. В 1 случае рукописная. Во 2 случае уже готовая, "из коробки".


Название: Re: Программная разработка доски Судоку
Отправлено: DmitryM от Мая 31, 2012, 11:01
Понятно, но если делать вручную судоку то при рисовании поля проблем не возникнет, зато далее будет очень весело: нажатую ячейку нужно выделить, для этого поле разделяем в виде сетки, отлавливаем куда тыкнул пользователь, зная координаты, выясняем на какую ячейку он попал, потом можно и нужно для ячейки подобрать значение (в судоку каждая ячейка имеет значение от 1-9), значит тоже самое что и с определением ячейки по координатам. Если мы захотим изменить размер окна, тут будет проще - используя метод scale() рисовальщика, и зная ширину/высоту окна, можем это осуществить :)
Но я не сторонник самоистезаний, если есть другой путь, хотя и сам не уверен, что другой путь приведет к цели, но этот способ гарантирует полный контроль над полем и возможность сделать на нем все что придумается :)
Используя mousePressEven получаешь координаты курсора, поделив координаты на размер ячейки получаешь номер ячейки, а дальше работаешь только с областью конкретной ячейки.

поле игры рисуется целиком вручную в пейнт эвенте, включая "рамочку". Групбоксы там только для меню.
Рисование в paintEven не самая удобная штука, да и сам paintEven часто вызваться. Намного удобней рисовать в QImage/QPixmap, а в paintEven вызывать drawImage/drawPixmap


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 31, 2012, 11:19
Цитата: Википедия
В последнее время появились модификации большего размера, чем 9 на 9 клеток. Например, существуют судоку с размерами 12×12 или даже 16×16, предназначенные для опытных игроков.
ещё есть составные судоку - такие не являются квадратными, а получаются путём пересечения квадратов


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 11:56
Камбала, если это то, о чём ты говоришь - http://www.scanword.info/puzzle/gattai/tripple_doku_1.gif или http://sudoku.relaks.com.ua/on-line-sudoku/sostavnie-sudoku/sostavnie-sudoku-00002.html

Тогда это делается в модели за минуту. Только надо будет ещё логику поменять расчёта, но это  в любом случае придётся делать.

PS закрасить или не отрисовывать рамки ненужных квадратов - легко.


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 31, 2012, 13:29
Рисование в paintEven не самая удобная штука, да и сам paintEven часто вызваться. Намного удобней рисовать в QImage/QPixmap, а в paintEven вызывать drawImage/drawPixmap

А я разве говорил что все нужно рисовать в пейнт эвенте постоянно? ;) Двойная буферизация - это необходимый минимум.


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Мая 31, 2012, 13:56
Камбала, если это то, о чём ты говоришь - http://www.scanword.info/puzzle/gattai/tripple_doku_1.gif или http://sudoku.relaks.com.ua/on-line-sudoku/sostavnie-sudoku/sostavnie-sudoku-00002.html

Тогда это делается в модели за минуту. Только надо будет ещё логику поменять расчёта, но это  в любом случае придётся делать.

PS закрасить или не отрисовывать рамки ненужных квадратов - легко.
да, это. я ж не говорил, что это сложно реализовать, а просто написал для общего развития :)


Название: Re: Программная разработка доски Судоку
Отправлено: DmitryM от Мая 31, 2012, 13:57
А я разве говорил что все нужно рисовать в пейнт эвенте постоянно? ;)

поле игры рисуется целиком вручную в пейнт эвенте, включая "рамочку". Групбоксы там только для меню.


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 13:59
А вот в пейнт евенте это будет на порядок сложнее ;) Даже для общего развития :)


Название: Re: Программная разработка доски Судоку
Отправлено: DmitryM от Мая 31, 2012, 14:48
А вот в пейнт евенте это будет на порядок сложнее ;) Даже для общего развития :)
О_о Вызвать QPainter::drawPixmap это так сложно?


Название: Re: Программная разработка доски Судоку
Отправлено: Igors от Мая 31, 2012, 15:01
Цитировать
Одну и ту же работу дали семерым солдатам и семерым инженерам. Семеро солдат до обеда сделали. А семеро инженеров до вечера обсуждали как лучше сделать, но работа даже не была начата
По-моему время обсуждения уже многократно превысило время любой реализации  :)


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 15:13
DmitryM.

Чтобы изменить с 1 квадрата на 4 соединённых, в model-View надо будет лишь изменить данные. Типа добавить в массив десяток записей.

Чтобы изменить с 1 квадрата на 4 соединённых, в painter-Event нужно переписать код, потестить, изменить параметры отрисовки, собственноручно потестить(вдруг где то константа), добавить в массив десяток записей, потестить, убрать баги и вылезающие линии, добавить реализацию щелчка на пустые ячейки(где не должно быть значений) и прочая прочая.

Сравнил масштаб?
В model-View надо изменить данные.

В Painter'e надо переписать код, добавить новые возможности. Возможно даже методы, перерасчёт значений, добавление нескольких проверок.


Название: Re: Программная разработка доски Судоку
Отправлено: Kurles от Мая 31, 2012, 16:06
Верх извращений - использовать model, paintEvent и QDataWidgetMapper :)


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 31, 2012, 16:40
поле игры рисуется целиком вручную в пейнт эвенте, включая "рамочку". Групбоксы там только для меню.

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

DmitryM.

Чтобы изменить с 1 квадрата на 4 соединённых, в model-View надо будет лишь изменить данные. Типа добавить в массив десяток записей.

Чтобы изменить с 1 квадрата на 4 соединённых, в painter-Event нужно переписать код, потестить, изменить параметры отрисовки, собственноручно потестить(вдруг где то константа), добавить в массив десяток записей, потестить, убрать баги и вылезающие линии, добавить реализацию щелчка на пустые ячейки(где не должно быть значений) и прочая прочая.

Сравнил масштаб?
В model-View надо изменить данные.

В Painter'e надо переписать код, добавить новые возможности. Возможно даже методы, перерасчёт значений, добавление нескольких проверок.

 ???

1. model-view это подход. В данном случае игра табличная, в принципе наверное через тейбл вью то она может проще и делается, а если ввести что-либо "не табличное", то сразу все пойдет прахом
2. изначально берясь за задачу ты должен изучить ее в деталях (грубо говоря - а что конкретно ты делаешь и что тебе надо). Сделать из одного квадрата четыре не так сложно и муторно, как Вы описали, если сразу подумать об архитектуре, а не наляпать по-быстрому :)


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 17:02
Правильно ufna. Если немного подумать можно и на ассемблере написать ;) А TableView из коробки ;)

Модель вью не отменяет других подходов. И в именно данной ситуации, без особо опыта с painter'ом TableView - самый лучший выбор на мой взгляд :)


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Мая 31, 2012, 17:30
Правильно ufna. Если немного подумать можно и на ассемблере написать ;) А TableView из коробки ;)

Модель вью не отменяет других подходов. И в именно данной ситуации, без особо опыта с painter'ом TableView - самый лучший выбор на мой взгляд :)

Ну не надо утрировать, все-таки мы говорим о hi-level api в любом случае ;) Пейнтер - очень классный механизм, я очень много с ним работал, особенно если говорить про мобильные платформы.

В данном случае, если не нужно никаких выкрутасов с графикой, то тейбл вью - наиболее прост. А если что-то нужно сверх черненьких ячеек - лично я бы сделал "на пеинтере". Кому что ближе, наверное.


Название: Re: Программная разработка доски Судоку
Отправлено: gil9red от Мая 31, 2012, 18:12
Да уж, не думал что мой невинный вопрос поднимет такой кипешь :)
В общем, понятно, эту задачу можно решить разными способами, а вот какой - это дело выбора: кому как удобно :)


Название: Re: Программная разработка доски Судоку
Отправлено: DmitryM от Мая 31, 2012, 18:36
Сравнил масштаб?
В model-View надо изменить данные.
В твоем варианте не лучше. Что бы все выглядела так как показывали на картинке придется возится с настройками таблицы, настройка стилей. скорее всего придется написать делегат. написать модель, потом все это добро объединить логикой судоку.   
Вот тебе пример MVC (http://doc.qt.nokia.com/4.7-snapshot/itemviews-chart.html)


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 21:42
Дмитрий зачем писать делегат? Оо. Зачем со стилями возиться??? Настройки таблицы Оо... Изменить 2 числа rowCount и ColumnsCount?
Пссс... Говорят же тебе люди (я люд), для данного примера, наиболее простой и быстрый способ - tableView.

А рисовать можно хоть Лейблами, сжатыми в точку - эт у кого как извращений хватит :)


Название: Re: Программная разработка доски Судоку
Отправлено: DmitryM от Мая 31, 2012, 22:18
Дмитрий зачем писать делегат? Оо. Зачем со стилями возиться??? Настройки таблицы Оо... Изменить 2 числа rowCount и ColumnsCount?
Пссс... Говорят же тебе люди (я люд), для данного примера, наиболее простой и быстрый способ - tableView.
Потому что это будет убогая прямоугольная таблица.


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Мая 31, 2012, 23:13
Дмитрий. Одна переменная и ячейка прозрачна. Десять-тридцать переменных - и у тебя получится гексаграмма, а не таблица ;)


Название: Re: Программная разработка доски Судоку
Отправлено: Racheengel от Июня 04, 2012, 10:10
Сколько текста-то :) А голосовать можно? Я за QTableWidget :)
Ибо, для такого проекта главное - не только отрисовка, но и корректная реакция на действия пользователя (клики по ячейкам и т.д.), это без таблицы 81 вариант проверять тогда, что ли? :)


Название: Re: Программная разработка доски Судоку
Отправлено: kambala от Июня 04, 2012, 11:52
ну почему 81 - там одной формулы должно быть достаточно


Название: Re: Программная разработка доски Судоку
Отправлено: Bepec от Июня 04, 2012, 13:36
Эта одна формула конечно хорошо. Но замучаешься мелочи делать. Типа - зажал пользователь клавишу, перевёл на другую ячейку. Отжал. И таких мелочей довольно много. А tableVie (даже виджет) уже лишён этих недостатков ;)


Название: Re: Программная разработка доски Судоку
Отправлено: ufna от Июня 04, 2012, 19:52
Эта одна формула конечно хорошо. Но замучаешься мелочи делать. Типа - зажал пользователь клавишу, перевёл на другую ячейку. Отжал. И таких мелочей довольно много. А tableVie (даже виджет) уже лишён этих недостатков ;)

Нет так страшен черт как его малюют :) Кроме грамотной буферизации (зависит от задачи конечно) все остальное - мелочи


Название: Re: Программная разработка доски Судоку
Отправлено: Racheengel от Июня 04, 2012, 20:54
Имхо, на таблвью сделать будет быстрее всего, и по объему кода тоже оптимально. Зачем велосипеду треугольные колеса?