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

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

07.05.2014, 19:15. Просмотров 2485. Ответов 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
Ответы с готовыми решениями:

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

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

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

Нарисовать круги на воде
for(i=0;i&lt;30;i++) { for(int it=0; it&lt;30; it++) { for(int q=0; q&lt;360; q++) { ...

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.