Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: Alexu007 от Июль 19, 2014, 10:06



Название: Вывод простой графики на форму
Отправлено: Alexu007 от Июль 19, 2014, 10:06
Что-то кладовая плохо пополняется. Только поэтому выкладываю, заранее предполагая закидывание автора (меня) какашками за говнокод. Программа по нажатию кнопки выводит простую графику на форму:

Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
//#include <QMessageBox>
#include "math.h"
 
 
 
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   myTimer = new QTimer();
 
   QObject::connect(ui->pushButton_1, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));
   QObject::connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));
   QObject::connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));
   QObject::connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));
 
   QObject::connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(MyEventHandler2()));
 
   QObject::connect(myTimer, SIGNAL(timeout()), this, SLOT(MyEventTimer()));
}
 
 
 
Widget::~Widget()
{
   delete ui;
}
 
 
 
// рисование на форме
void Widget::paintEvent(QPaintEvent *event)
{
 
   QPoint p1, p2;
 
   QPainter P(this);
 
   // создаем кисть(черного цвета)
   QPen penB(Qt::black);
   // ширина кисти в пикселях
   penB.setWidth(1);
   // создаем кисть(красного цвета)
   QPen penR(Qt::red);
   // ширина кисти в пикселях
   penR.setWidth(2);
 
   int sy = height();
 
   p1.setX(0);
   p1.setY(sy/2);
   p2.setX(width());
   p2.setY(sy/2);
 
   // передаем нашему рисовальщику кисть черного цвета
   P.setPen(penB);
   // рисуем горизонтальную линию по координатам
   P.drawLine(p1,p2);
 
   // начало построения графика
   p2.setX(0);
   p2.setY(sy/2);
 
   P.setPen(penR);
 
   for(int i = 0; i < src.size(); i+=2)
   {
       p1 = p2;
 
       p2.setX(src[i]);
       p2.setY(sy/2 + src[i+1]);
 
       P.drawLine(p1,p2);
       //P.drawPoint(p2);
   }
}
 
 
 
// функция готовит данные для рисования функций
void Widget::make_func(int var)
{
   #define PI 3.14159
 
   float x, y;
   int Px, Py;
   int mas;
 
   int sx = width();
   int sy = height();
 
   src.clear();
 
   for(Px = 0; Px < sx; Px+=3)
   {
       x = 3*Px*PI/sy;
 
       switch(var)
       {
           case 0: break;
           case 1: {y = sin(x);  mas = 4; break;}
           case 2: {y = cos(x);  mas = 4; break;}
           case 3: {y = tan(x);  mas = 150; break;}
           case 4: {y = atan(x); mas = 5; break;}
       }
 
       Py = (sy-(y+1)*sy)/mas;
 
       src += Px;
       src += Py;
   }
 
   this->repaint();
}
 
 
 
// обработка нажатия кнопки 1-4
void Widget::MyEventHandler1()
{
 
   myTimer->stop();
 
   QString str = sender()->objectName();
   make_func(str.remove(0, 11).toInt());
 
}
 
 
 
// обработка нажатия кнопки abracadabra
void Widget::MyEventHandler2()
{
   static int fl = 0;
 
   if (!fl) {myTimer->start(700); fl = 1;}
   else     {myTimer->stop();     fl = 0;}
}
 
 
 
// обработка сигналов таймера
void Widget::MyEventTimer()
{
   static int num = 1;
 
   src.clear();
 
   for(int i = 0; i < width()/8; i++)
   {
       src += i*8;
       src += height()/5 - (i*num)%167;
       num+=2;
   }
 
   this->repaint();
}


Название: Re: Вывод простой графики на форму
Отправлено: gil9red от Июль 19, 2014, 10:42
Первая пошла ;D
А зачем делать так много пустых строк? :)


Название: Re: Вывод простой графики на форму
Отправлено: Alexu007 от Июль 19, 2014, 11:27
Мне кажется так понятнее, отделяется одно от другого, не сваливается всё в кучу.


Название: Re: Вывод простой графики на форму
Отправлено: Bepec от Июль 19, 2014, 11:33
пустые строки хорошо. но вот лучше б их количество систематизировать :) между функциями по 3, между кусками кода по 1.


Название: Re: Вывод простой графики на форму
Отправлено: Alexu007 от Июль 19, 2014, 11:49
Исправил, 3 и 1.


Название: Re: Вывод простой графики на форму
Отправлено: GreatSnake от Июль 19, 2014, 12:58
Наверное стоит ещё добавить сглаживание.


Название: Re: Вывод простой графики на форму
Отправлено: Alexu007 от Июль 19, 2014, 13:46
А что эта?


Название: Re: Вывод простой графики на форму
Отправлено: gil9red от Июль 19, 2014, 14:16
А что эта?

Очень клевая штука -- Сглаживание (http://qt-project.org/doc/qt-4.8/qpainter.html#RenderHint-enum) ;)


Название: Re: Вывод простой графики на форму
Отправлено: kambala от Июль 19, 2014, 14:57
очередной шедевр от автора морского боя :(

ну вот как такое можно в кладовую выкладывать?
Код
C++ (Qt)
ui->pushButton_1


Название: Re: Вывод простой графики на форму
Отправлено: Alexu007 от Июль 19, 2014, 15:15
А что конкретно не устраивает: "ui", "->", или "pushButton_1"?


Название: Re: Вывод простой графики на форму
Отправлено: Bepec от Июль 19, 2014, 15:59
Скорее всего его не устраивает то, что название кнопки не соответствует её назначению. Хотя на мой взгляд в настолько простом проекте это допустимо :)

PS но хорошим тоном считается называть по смыслу. pushButton_sin pushButton_cos и так далее. Для других программистов, чтобы понять где эта кнопка, надо лезть в файл формы и там уже находить кнопку. А если она будет названа по значению, то сразу ясно за что она отвечает.

PPS самый ужас когда пишут checkbox_28->isChecked(). И таких чекбоксов штук 40. И хочется убить разраба :D


Название: Re: Вывод простой графики на форму
Отправлено: Igors от Июль 22, 2014, 13:12
Очень клевая штука -- Сглаживание (http://qt-project.org/doc/qt-4.8/qpainter.html#RenderHint-enum) ;)
Правда как она работает - хз (уже спрашивал). Хотя зачем это нужно знать - работает ведь, результат налицо.