Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KURS_13.doc
Скачиваний:
0
Добавлен:
17.01.2020
Размер:
624.64 Кб
Скачать

10. Пример программы

В данном разделе приведен пример программы с использованием графических возможностей языка С++. Для разработки программы использовалась среда Qt Creator. Пример иллюстрирует правильное оформление программы. Каждая функция снабжена комментариями. Кроме того, для каждой функции прокомментированы имена используемых переменных и указано их назначение.

//form.h

#ifndef FORM_H

#define FORM_H

#include <QtGui>

#include <QVBoxLayout>

#include <QWidget>

#include <QPushButton>

#include <QLabel>

#include <QPixmap>

namespace Ui {

class Form;

}

class Form : public QWidget

{

Q_OBJECT

public:

QLabel *pLabel;

void transmit(QPixmap *_pix); /* прототип функции передачи рисунка на форму «Form» */

explicit Form(QWidget *parent = 0);

~Form();

private:

Ui::Form *ui;

};

#endif // FORM_H

//mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QtGui>

#include <QVBoxLayout>

#include <QWidget>

#include <QLabel>

#include <QPixmap>

#include <iostream>

#include <math.h>

#include "form.h"

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

bool check_ab; //переменная – признак правильности ввода a и b

bool check_m; //переменная – признак правильности ввода mx и my

bool check_step; //переменная – признак правильности ввода step

int mx, my, pix_size; //масштабы по осям ox, oy, размер области рисования

float a, b, step; //границы отрезка ab и шаг

Form grafForm; //объект класса Form (форма для отображения графика)

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private:

Ui::MainWindow *ui; /* класс, хранящий параметры пользовательского интерфейса (формируется автоматически) */

void drawDiagramm(int n); /* функция отрисовки графика функции и осей в буфер (n-номер функции) */

void drawFunc(int _n, QPainter *_paint); /* отдельная функция отрисовки самого графика функции, вызывается функцией «drawDiagramm» */

private slots: //функции, вызываемые сигналами

void checkAB(); //проверка правильности ввода a и b

void checkM(); //проверка правильности ввода масштабов

void checkStep(); //проверка правильности ввода шага

void drawInitialize(); /* функция запуска отрисовки в соответствии со значениями переменных, отвечающих за правильность ввода. Номер функции определяется тоже здесь в соответствии со значением RadioButton (1-4) */

};

#endif // MAINWINDOW_H

//form.cpp

#include "form.h"

#include "ui_form.h"

Form::Form(QWidget *parent) :

QWidget(parent),

ui(new Ui::Form)

{

ui->setupUi(this);

}

Form::~Form()

{

delete ui;

}

void Form::transmit(QPixmap *_pix)

{ //описание функции передачи изображения на надпись1 в форме «Form»

ui->label->setPixmap(*_pix);

}

// main.cpp

#include <QtGui/QApplication>

#include "form.h"

#include "mainwindow.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;

w.show();

return a.exec();

}

//mainwindow.cpp

#include "form.h"

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this); //код, сгенерированный компилятором

//инициализация переменных

check_ab = check_m = check_step = false;

pix_size=501;

//связывание сигналов от интерфейса с функциями

connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(checkAB()));

connect(ui->textEdit_2, SIGNAL(textChanged()), this, SLOT(checkAB()));

connect(ui->textEdit_3, SIGNAL(textChanged()), this, SLOT(checkStep()));

connect(ui->textEdit_4, SIGNAL(textChanged()), this, SLOT(checkM()));

connect(ui->textEdit_5, SIGNAL(textChanged()), this, SLOT(checkM()));

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(drawInitialize()));

//скрываем надписи, содержащие сообщения об ошибках

ui->label_4->hide();

ui->label_5->hide();

ui->label_8->hide();

}

MainWindow::~MainWindow() { delete ui; }

void MainWindow::checkAB()

{ //проверка, что поля для ввода a и b не пустые

if ( !ui->textEdit->toPlainText().isEmpty() &&

!ui->textEdit_2->toPlainText().isEmpty() )

{ //проверка несоответствия a и b условию a<b

if ( ui->textEdit->toPlainText().toFloat() >=

ui->textEdit_2->toPlainText().toFloat() )

{ //визуализация надписи, содержащей сообщение об ошибке

ui->label_4->show();

check_ab=false; //флаг, указывающий, что ввод a и b не корректен

}

else

{ //скрытие надписи, содержащей сообщение об ошибке

ui->label_4->hide();

check_ab=true; //флаг, указывающий, что ввод a и b корректен

}

}

}

void MainWindow::checkStep() //аналогично с функцией checkAB()

{

if ( !ui->textEdit_3->toPlainText().isEmpty() )

{

if ( ui->textEdit_3->toPlainText().toFloat() <= 0 )

{

ui->label_5->show();

check_step=false;

}

else

{

ui->label_5->hide();

check_step=true;

}

}

}

void MainWindow::checkM() //аналогично с функцией checkAB()

{

if ( !ui->textEdit_4->toPlainText().isEmpty() &&

!ui->textEdit_5->toPlainText().isEmpty() )

{

if ( ui->textEdit_4->toPlainText().toInt() <= 0 ||

ui->textEdit_5->toPlainText().toInt() <= 0 )

{

ui->label_8->show();

check_m=false;

}

else

{

ui->label_8->hide();

check_m=true;

}

}

}

void MainWindow::drawInitialize()

{ //проверка переменных, отвечающих за корректность ввода данных

if (check_ab && check_m && check_step)

{ //передача значений полей формы в поля класса

a = ui->textEdit -> toPlainText().toFloat();

b = ui->textEdit_2->toPlainText().toFloat();

step = ui->textEdit_3->toPlainText().toFloat();

mx = ui->textEdit_4->toPlainText().toInt();

my = ui->textEdit_5->toPlainText().toInt();

/* текст из полей TextEdit (1-5) преобразуется во float/int и полученные значения записываются в соответствующие переменные */

int num_func=0;

//num_func принимает значение, равное номеру выбранной функции

if (ui->radioButton -> isChecked()) num_func=1;

if (ui->radioButton_2->isChecked()) num_func=2;

if (ui->radioButton_3->isChecked()) num_func=3;

if (ui->radioButton_4->isChecked()) num_func=4;

if (num_func) drawDiagramm(num_func); /* вызов функции отрисовки изображения (оси график и т.п.) */

}

}

void MainWindow::drawDiagramm(int n)

{

int nx,ny,x,y,ym,xm;

//создание объекта, хранящего массив пикселей (изображение)

QPixmap *pix = new QPixmap(pix_size,pix_size);

//заливка фона изображения чёрным цветом

pix->fill(Qt::black);

//передача изображения классу, содержащему функции для рисования

QPainter paint(pix);

//задание цвета границы рисуемого объекта

paint.setPen(Qt::white);

//отрисовка координатных осей

paint.drawLine(0, pix_size/2, pix_size, pix_size/2);

paint.drawLine(pix_size/2, 0, pix_size/2, pix_size);

nx=pix_size/(2*mx);

ny=pix_size/(2*my);

y=0;

//2 цикла для отрисовки штрихов единичных отрезков на осях

ym=(pix_size/2);

for(x=-nx;x<=nx;x++)

{

xm=(pix_size/2)+(x*mx);

paint.drawLine(xm,ym-3,xm,ym+3);

}

x=0;

xm=(pix_size/2);

for(y=-ny;y<=ny;y++)

{

ym=(pix_size/2)-(y*my);

paint.drawLine(xm-3,ym,xm+3,ym);

}

drawFunc(n, &paint); //вызов функции отрисовки графика

paint.end(); //завершение отрисовки

//передача буфера в класс, отвечающий за окно построения графика

grafForm.transmit(pix);

//визуализация формы, на которой изображён график

grafForm.show();

}

void MainWindow::drawFunc(int _n, QPainter *_paint)

{

float y,xm,ym=0,R=120,G=0,B=160;

for(float x=a; x <=b; x+=step)

{ //цикл, подсчитывающий значения функции f(x) с номером n

switch (_n)

{

case 1: { y=sin(x); break; }

case 2: { y=pow(x,2.0); break; }

case 3: { y=cos(x); break; }

case 4: { y=x; break; }

}

//вычисление пиксельных координат точки

xm=(pix_size/2)+(x*mx);

ym=(pix_size/2)-(y*my);

/* при выходе значения функции за пределы окна происходит переход к следующему шагу (срабатывает только при отрисовке функции y=x2 ) */

if (fabs(ym)>500) continue;

//отладочная печать (результаты выводятся в окно отладки)

qDebug() << "xm=" << xm << " ym=" << ym ;

_paint->setPen(QColor(R,G,B));

_paint->drawPoint(xm,ym); //рисование точки

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]