Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
1

Нарисовать сетку и круги

07.05.2014, 19:15. Просмотров 2385. Ответов 3
Метки нет (Все метки)

Здравствуйте. Заданы размеры сетки и есть виджет в окне. Как в Qt правильно нарисовать сетку из квадратов, чтобы затем нарисовать в каждом квадрате цветные круги? Необходимо, чтобы при растягивании окна сетка всё равно оставалось с квадратами(думаю с помощью полос прокрутки), а круги - кругами.

Моя попытка:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void Widget::paintGrid(QPainter &p){
QRect borders(0, 0, width()-1, height()-1);
QColor gridColor = Qt::black;
gridColor.setAlpha(40);
p.setPen(gridColor);
qreal cellWidth = (qreal)((width()-1)/(userWidth));
for(qreal k = 0; k <= (width()-1); k += cellWidth)
    p.drawLine(k, 0, k, height()-1);
qreal cellHeight = (qreal)((height()-1)/(userHeight));
for(qreal k = 0; k <= height()-1; k += cellHeight)
    p.drawLine(0, k, width()-1, k);
p.drawRect(borders);
}
 
void Widget::paintMap(QPainter &p){
qreal cellWidth = (qreal)width()/(userWidth);
qreal cellHeight = (qreal)height()/(userHeight);
for(unsigned int k = 0; k < userWidth; k++)
{
    for(unsigned int j=0; j < userHeight; j++)
    {
            qreal left = (qreal)(cellWidth*(j+1)-cellWidth+1);
            qreal top  = (qreal)(cellHeight*(k+1)-cellHeight+1);
            QRectF r(left, top, cellWidth-1, cellHeight-1);
            p.setBrush(Qt::green);
            p.drawEllipse(r);
     }
}
}
Но при растягивании квадраты превращаются в прямоугольники, а круги в эллипсы, да и вообще круги рисуются поперёк сетки. Заранее спасибо за помощь
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2014, 19:15
Ответы с готовыми решениями:

Круги на воде
Ребят, задали написать прогу бассейн с водой, в него кинули камень и от камня пошли круги по воде,...

QTableWidget скрыть сетку
Есть QTableWidget. Как скрыть &quot;сетку&quot;?

Основы программирования GUI с использованием Qt (Круги на воде)
Помогите решить две задачи На ++СИ 2.Круги на воде. Экран изображает бассейн с водой, в который...

Как показать сетку в qlistview
Может быть простой вопрос. Но не могу найти как в qlistview показать границы прямоугольников ячеек....

Нарисовать круги
Добрый вечер, господа, начинаю изучать C# и нужна ваша помощь Мне надо нарисовать эти круги, но...

3
The_Prophet
8 / 8 / 0
Регистрация: 13.01.2013
Сообщений: 177
07.05.2014, 23:25 2
Xerocry, мм... решишь проблему с квадратом, с кругами всё решиться само собой.
Если ты растягиваешь виджет только в одну сторону, конечно квадрат станет прямоугольником)) тут вообще дело сложное. Можно сделать, чтобы при увеличении одной стороны пропорционально увеличивалась другая, но тогда твои квадраты будут накладываться один на один, если растягивать только в одну сторону. Плюс к этому можно попытаться ещё и центрировать каждый квадрат относительно квадратов вокруг, но тогда однозначно будут пустые места.
Поэтому тебе, скорее всего, придётся всё перерисовывать, заново рассчитывать размеры и количество квадратов, обрабатывая событие нажатия и отпускания мыши. То есть нажали, растягивают - ничего не происходит, отпустил - нарисовалось. Потому что если перерисовывать постоянно, как только изменяется размер, будет подлагивать. Хотя фиг знает)

Если делать с прокруткой, то можешь сразу нарисовать столько дофига квадратов с кругами, что если в полный экран растянуть всё ещё будет куда крутить)) но это решение немного не очень.
1
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
08.05.2014, 00:02  [ТС] 3
The_Prophet, Так, ясно, перерисовывать при отпускании мыши. А если у меня при клике на виджет с сеткой также обрабатывается сигнал клика мыши, это не будет мешать? Или обрабатывать нужно клик по окну, а не по виджету? Или есть специальный метод для обработки сигнала растягивания?

С прокруткой нельзя рисовать сразу много, у сетки же определённые размеры.
0
The_Prophet
8 / 8 / 0
Регистрация: 13.01.2013
Сообщений: 177
08.05.2014, 00:30 4
Xerocry, если при клике тоже обработать, то изображение просто лишний раз перерисуется. Визуально изображение может моргнёт разок и всё. Но лучше придумай какое-нибудь условие. Зачем заставлять программу делать лишние действия?
Насколько я помню у виджета есть событие resizeEvent, которое срабатывает при каждом изменении размера. Сначала попробуй обработать его и если будет лагать, тогда уже придумывай условие, чтобы перерисовывалось при отпускании мыши. Или вообще просто как можно меньше раз, например, при изменении размеров окна на 10 пикселов.
0
08.05.2014, 00:30
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2014, 00:30

Нарисовать Круги
Люди выручите пожалуйста! Мне нужно нарисовать Круги чтоб они были на одинаковом расстояние и...

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

Нарисовать круги и квадраты
Построить изображение, используя оператор цикла:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.