Russian Qt Forum
Май 05, 2024, 01:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Программная разработка доски Судоку  (Прочитано 36010 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Май 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 ячеек, и чтобы было небольшое расстояние между этими квадратами.

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

и убедительная просьба:
не надо писать чтобы воспользовался поиском на сайте - уже делал Смеющийся
« Последнее редактирование: Ноябрь 11, 2012, 20:33 от gil9red » Записан

mutineer
Гость
« Ответ #1 : Май 30, 2012, 16:00 »

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

вот это попробуй
http://doc.crossplatform.ru/qt/4.7.x/html-qt/qgridlayout.html#setSpacing
Записан
Alatey
Гость
« Ответ #2 : Май 30, 2012, 16:15 »

Вот мой "рагульский" способ, зато рабоооочий Смеющийся
Код:
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());
}
Записан
Bepec
Гость
« Ответ #3 : Май 30, 2012, 17:02 »

Я бы посоветовал QTableView для вашей задачи.

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

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Май 30, 2012, 17:16 »

Alatey, спасибо что напомнили о том что есть возможность переопределить событие изменения размера виджета)

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

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Май 30, 2012, 17:19 »

Я вот не знаю, а можно сделать так, чтобы для отдельной ячейки таблицы можно было выбрать цвет/картинки??
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #6 : Май 30, 2012, 17:32 »

можно
Записан

Изучением 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
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Май 30, 2012, 17:36 »

можно
kambala, а как?? Улыбающийся Улыбающийся
Записан

Bepec
Гость
« Ответ #8 : Май 30, 2012, 17:39 »

Просто возьми таблицу. Тот же эксцель.

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

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

PS выложи картинку, чего ты хочешь сделать. А то я не оч соображаю твою хотелку Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Май 30, 2012, 17:49 »


Хочу сделать что то вроде такого =)
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Май 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();

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

Bepec
Гость
« Ответ #11 : Май 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);
        }


Ты сам им не даёшь менять размер Улыбающийся А так они милые и очень послушные Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Май 30, 2012, 18:12 »

Bepec, я просто указал их начальный размер, а не фиксированный Улыбающийся
и если и убрать этот цикл, то ячейки просто станут прямоугольными но при этом ничего не изменится  Грустный
Записан

Bepec
Гость
« Ответ #13 : Май 30, 2012, 18:25 »

Виновен Веселый Я Улыбающийся Нерассмотрел начальный.

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Май 30, 2012, 18:32 »

Как то уж мудренно выглядит Грустный
не очень хочется делать наследование, потом переопределение...
жаль что в этом классе нет метода, который бы сам делал resize таблицы и ячеек Улыбающийся
Записан

Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


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