Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70

Рисование точек по координатам

22.01.2016, 10:55. Показов 9536. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Хочу сделать некий виджет, как локатор....т.е начерчены окружности, посылаешь координаты и рисуются точки(их много).
Кружки то я нарисовал, а вот как правильно задать обработку координат и рисование точек не понимаю.
что есть:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Ring::Ring( QWidget *parent ) :
    QWidget( parent )
{
    dot_1 =1;
    dot_2 =1;
    dot_3 =1;
 
    // Устанавливаем кодеки
    QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "UTF-8" ) );
    QTextCodec::setCodecForTr( QTextCodec::codecForName( "UTF-8" ) );
 
    resize(300, 300);
}
 
void Ring::paintEvent(QPaintEvent *){
 
 int side = qMin(width(), height());
 
 QPainter painter(this);
 painter.setRenderHint(QPainter::Antialiasing);
 painter.translate(width() / 2, height() / 2);
 painter.scale(side / 300.0, side / 300.0);
 
 painter.setPen(Qt::NoPen);
 painter.save();
 
 painter.restore();
 
 painter.setPen(QPen(Qt::black,1,Qt::SolidLine));
 painter.drawEllipse(-50,-50,100,100);
 
 painter.setPen(QPen(Qt::black,1,Qt::SolidLine));
 painter.drawEllipse(-100,-100,200,200);
 
 painter.setPen(QPen(Qt::black,1,Qt::SolidLine));
 painter.drawEllipse(-150,-150,300,300);
 
 painter.drawLine(0,150,0,-150);
 painter.drawLine(-150,0,150,0);
 
 painter.setPen(QPen(Qt::black,2,Qt::SolidLine));
 painter.drawPoint(dot_1,dot_2);
 
 
}
Заголовочный
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
#include <QWidget>
 
class Ring : public QWidget
{
    Q_OBJECT
public:
    Ring( QWidget *parent = 0 );
 
    void setDot(int x, int y, int signal )
    {
        dot_1 = x;
        dot_2 = y;
        dot_3 = signal;
 
        //update();
    }
 
private:
 
int dot_1, dot_2, dot_3;
 
signals:
 
protected:
     void paintEvent( QPaintEvent *event );
    
public slots:
    
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2016, 10:55
Ответы с готовыми решениями:

Рассчитать площадь N-угольник по координатам точек
В приложении есть возможность ставить точки курсором мыши. После того как пользователь поставил столько точек, сколько ему нужно, при...

Рисование точек на графике в качестве неких объектов
Снова доброй ночи, уважаемый форум. Задача стоит следующая: существует массив типа complex&lt;double&gt; хранящий в себе координаты точек...

Рисование множества точек при получении пакета с сети
Здравствуйте! Такая проблема - приходят данные по сети с широковещательного сообщения. При получении пакета, нужно нарисовать точку, причем...

40
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
25.01.2016, 12:57
Студворк — интернет-сервис помощи студентам
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
MyPoint { int x,y,z };
 
void Main(){
QVector<MyPoint> points;
MyPoint point;
point.x = 1;
point.y = 1;
point.z = 2;
points.push_back(point); // points: {1,1,2}
point.y = 2;
points.push_back(point); // points: {1,1,2}, {1,2,2}
qDebug() << points[0].x << points[0].y; // 1 1
}
1
182 / 37 / 5
Регистрация: 29.01.2013
Сообщений: 256
25.01.2016, 13:02
Проектик. Собрал из исходников тутошних.
Вложения
Тип файла: rar Radar.rar (2.0 Кб, 14 просмотров)
1
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
25.01.2016, 13:25  [ТС]
Спасибо теперь понятнее.
конструкция считывания вот такая мне больше понятна
C
1
2
     foreach(MyPoint *p, pv){
     painter.drawPoint(p->x,p->y);
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
25.01.2016, 13:38
Если так, нужно следить за памятью. В частности при удалении элемента вызывать delete, а в деструкторе прописать
C++ (Qt)
1
2
3
4
Ring::~Ring()
{
    qDeleteAll(pv);
}
Иначе насорите в памяти.
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
25.01.2016, 16:12  [ТС]
Так я реализовал эту программку как виджет и встроил в библиотеку дизайнера в "Пользовательские виджеты".
Теперь создаю другую прогу, форму и с нее мне доступен метод addPoint (он записывает точку(с атрибутами) в вектор) всё хорошо, всё работает. Но хотелось бы передавать сразу вектор целиком. это возможно?
0
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
25.01.2016, 16:57
Вот программка, которая рисует треугольник, а потом по его углам рисует чёрные точки. Может поможет?
Вложения
Тип файла: 7z Polygon.7z (7.4 Кб, 7 просмотров)
0
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
25.01.2016, 20:21
Вот так? Осталось только точки допилить:
Миниатюры
Рисование точек по координатам  
1
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
26.01.2016, 06:45
GoldSieg, возможно, если в сигналах-слотах передавать сразу вектор.
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
26.01.2016, 07:57  [ТС]
alexu_007, Благодарюза програмку я разберу её обязательно, но пока попробую свою поковырять.

icpu, да мне для начала хотябы просто в коде(в теле внешней программы) это реализовать. Я пробовал в виджете сделать swap контейнеров, а для этого мне нужен вектор структуры MyPoint, а я не могу её переопределить в коде.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
26.01.2016, 08:10
GoldSieg, swap? Это что-то про двойную буферизацию? Если так, не парьтесь, передавайте адрес вектора при создании виджета или при инициализации. Они в любом случае работают в одном потоке.
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
 
class Ring { 
  Ring::Ring(QVector<MyPoint*> * p = Q_NULLPTR);
  /*...*/ 
  QVector<MyPoint*> * points;
  /*...*/};
 
Ring::Ring(QVector<MyPoint*> * p)
  : points(p) {/*...*/}
 
void Ring::paintEvent(...)
{
  if (points)
  {
    foreach(MyPoint *p, *pv)
      painter.drawPoint(p->x,p->y);
 
  }
}
 
class MainWidget { /*...*/ QVector<MyPoint*> points; /*...*/ };
 
MainWidget::MainWidget()
  : Ring(&points) {}
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
26.01.2016, 09:10  [ТС]
icpu, А вот теперь я в край запутался. c этими контейнерами... сколько их тут points? pv? p?
переделал свой код и теперь ругается на append в методе.
C
1
2
3
4
5
6
7
8
9
void Ring::addPoint(int x_, int y_, int z_)
{
    MyPoint* p = new MyPoint;
    p->x = x_;
    p->y = y_;
    p->z = z_;
    pv.append(p);
    //return true;
}
ошибка: request for member 'append' in '((Ring*)this)->Ring:v', which is of non-class type 'QVector<MyPoint*>*'
C
1
ошибка: request for member 'append' in '((Ring*)this)->Ring::pv', which is of non-class type 'QVector<MyPoint*>*'
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
26.01.2016, 10:19
Книжки читаете? Читайте-читайте. Дойдите до раздела "классы" и ознакомьтесь.
Там, в частности, будет написано про то, что:
Доступ к методам и полям класса осуществляется с помощью оператора "точка" (".") myClass.foo()
Если используется указатель на класс, то доступ осуществляется с помощью оператора "стрелочка ("->") p_myClass->foo(); что эквивалентно (*myClass).foo();
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
26.01.2016, 10:54  [ТС]
icpu, Да читал уже про это, тока ситуацию не определил.. Теперь там ошибка пропала, вот в ГлавномВиджете
C
1
2
class MainWidget  {QVector<MyPoint*> *points;};
}
MyPoint не подхватывает..
C
1
2
ошибка: 'MyPoint' was not declared in this scope
 template argument 1 is invalid
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
26.01.2016, 11:11
Я, пожалуй, напишу достаточно грубо, но компилятор, в данном случае, даёт более чем исчерпывающую информацию о том, что ему не нравится, а гугл в первой же ссылке - как с этим бороться.
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
26.01.2016, 11:26  [ТС]
icpu, грубо ни грубо, но я понимаю что он ее не видит.
переопределить я её не могу.
есть подключить заголовочный #include "ui_widget.h" MyPoint подсвечивается, но лезут другие ошибки.
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
26.01.2016, 11:32
о, тут 2 листа) прошу прощения) лишний коммент.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
26.01.2016, 11:36
GoldSieg, а MyPoint у вас в каком файле описана?
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
26.01.2016, 12:38  [ТС]
icpu, я говорил что я делаю этот виджет как бы плагином(в библиотеке дизайнера он хранится) мне кажется это важно.
Создаю новую программу с формой(назовем MainWidget). помещаю на форму этот виджет и мне становится доступен метод addPoint(он добавляет точку), но нет доступа и видимости к структуре MyPoint.
MyPoint обьявленна в файле ring.h
C
1
2
3
4
5
6
7
8
struct MyPoint{int x,y,z;};
 
class Ring : public QWidget
{
    Q_OBJECT
public:
    //struct MyPoint{int x,y,z;};
    explicit Ring(QVector<MyPoint*> * p=0 );
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
26.01.2016, 12:50
Либо подключи "ring.h" в заголовочник формы, либо напиши перед классом формы struct MyPoint;, а "ring.h" подключи в файл исходных кодов (.cpp). Либо вынеси структуру в отдельный файл и подключи ко всем остальным. Либо используй QPoint3.

Второй вариант называется предварительным объявлением. Интересная штука, о ней имеет смысл почитать.
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 70
26.01.2016, 13:26  [ТС]
icpu, я подключил #include "ui_widget.h" а вот в ней уже есть подключение "ring.h. Теперь MyPoint подствечивает, но новая ошибка..
C
1
 ui_widget.h:33: ошибка: no matching function for call to 'Ring::Ring(QWidget*&)'
строчка куда указывает
C
1
Ring = new Ring(Widget);
как я понимаю проблема в указателях
explicit - уже убирал....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2016, 13:26
Помогаю со студенческими работами здесь

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3 4 1 3 кпримеру, мне нужно...

Рисование точек по координатам массива
у меня два массива, один хранит x, а другой y. я даже не знаю какую форму надо выбирать (canvas, image или что-то ещё), и какое нужно...

Как нарисовать много точек, если в классе Graphics рисование точек не предусмотрено вообще?
Делаю свой граф. редактор. В нем нужно линии строить так, чтобы они состояли из точек. DrawPoint в классе Graphics нет, как быть? если...

Рисование по координатам
Здравствуйте, мне нужно ввести две координаты X и Y и должна нарисоваться линия.Как это можно реализовать?

3d рисование по координатам
Добрый вечер! Мне необходимо нарисовать в 3д множество точек, зная координаты каждой точки (x,y,z). В WPF все рисуется с помощью...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru