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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод простой графики на форму  (Прочитано 8451 раз)
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();
}
« Последнее редактирование: Июль 19, 2014, 11:48 от Alexu007 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 19, 2014, 10:42 »

Первая пошла Смеющийся
А зачем делать так много пустых строк? Улыбающийся
Записан

Alexu007
Гость
« Ответ #2 : Июль 19, 2014, 11:27 »

Мне кажется так понятнее, отделяется одно от другого, не сваливается всё в кучу.
Записан
Bepec
Гость
« Ответ #3 : Июль 19, 2014, 11:33 »

пустые строки хорошо. но вот лучше б их количество систематизировать Улыбающийся между функциями по 3, между кусками кода по 1.
Записан
Alexu007
Гость
« Ответ #4 : Июль 19, 2014, 11:49 »

Исправил, 3 и 1.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июль 19, 2014, 12:58 »

Наверное стоит ещё добавить сглаживание.
Записан

Qt 5.11/4.8.7 (X11/Win)
Alexu007
Гость
« Ответ #6 : Июль 19, 2014, 13:46 »

А что эта?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Июль 19, 2014, 14:16 »

А что эта?

Очень клевая штука -- Сглаживание Подмигивающий
Записан

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Июль 19, 2014, 14:57 »

очередной шедевр от автора морского боя Грустный

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

Изучением 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
Alexu007
Гость
« Ответ #9 : Июль 19, 2014, 15:15 »

А что конкретно не устраивает: "ui", "->", или "pushButton_1"?
Записан
Bepec
Гость
« Ответ #10 : Июль 19, 2014, 15:59 »

Скорее всего его не устраивает то, что название кнопки не соответствует её назначению. Хотя на мой взгляд в настолько простом проекте это допустимо Улыбающийся

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

PPS самый ужас когда пишут checkbox_28->isChecked(). И таких чекбоксов штук 40. И хочется убить разраба Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июль 22, 2014, 13:12 »

Очень клевая штука -- Сглаживание Подмигивающий
Правда как она работает - хз (уже спрашивал). Хотя зачем это нужно знать - работает ведь, результат налицо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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