Файл: Лабораторная работа 3 20 Тема Ипользование вспомогательных функций и вывод нескольких чисел c помощью одного элемента управления 20.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 18.03.2024
Просмотров: 50
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Запустите программу, нарисуйте несколько окружностей разного цвета и проверьте работу команд меню.
Задания для самостоятельного выполнения
-
Создайте приложение, которое позволяет рисовать отрезки прямых линий с помощью мыши. Создаваемая линия должна быть видима в процессе построения. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое позволяет рисовать закрашенные прямоугольники с помощью мыши. Создаваемый прямоугольник должен быть видим в процессе построения. Цвет прямоугольников должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое позволяет рисовать закрашенные треугольники, задаваемые тремя щелчками мыши в вершинах. Цвет треугольников должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое позволяет рисовать закрашенные круги с помощью мыши. Создаваемая окружность должна быть видима в процессе построения. Цвет окружностей должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое рисует закрашенные пятиконечные звезды (вписанную в воображаемую окружность; центр окружности и одна точка на окружности задаются щелчками мыши). Цвет каждой звездочки должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое рисует закрашенные квадраты с помощью мыши так, что мышь проходит по диагонали квадрата от одной вершины к другой. Квадрат должен быть виден в процессе построения. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое рисует дуги с помощью мыши так, что мышь определяет начало и конец дуги. Дуга должен быть видима в процессе построения. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое рисует правильные треугольники с помощью мыши так, что указатель мыши находится в одной из вершин треугольника. Треугольник должен быть видим в процессе построения и может поворачиваться. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. При отпускании мыши треугольник закрашивается. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте приложение, которое рисует правильные 8-конечные звездочки с помощью мыши так, что указатель мыши находится в одной из вершин звездочки. Звездочка должна быть видима в процессе построения и может поворачиваться. При отпускании мыши звездочка закрашивается. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте однодокументное приложение, которое рисует правильные 5-конечные звездочки с помощью мыши так, что указатель мыши находится в одной из вершин звездочки. Звездочка должна быть видима в процессе построения и может поворачиваться. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла. -
Создайте однодокументное приложение, которое рисует правильные шестиугольники с помощью мыши так, что указатель мыши находится в одной из вершин шестиугольника. Шестиугольник должен быть видим в процессе построения и может поворачиваться. Цвет линий должен определяться с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла..
Лабораторная работа № 8
Тема: «Области отсечения»
Пример 1: программа, которая рисует 6-угольник, цвет которого можно изменять с помощью немодального диалогового окна с наборными счетчиками (Spin). Диалоговое окно появляется при нажатии кнопки «Диалог».
Создайте проект на базе главного окна.
Д обавьте дочернее диалоговое окно, описываемое классом Dialog (выберите в меню Файл | Новый файл или проект... , в появившемся диалоговом окне выберите Qt | Класс формы Qt Designer).
Спроектируйте окно как показано на рисунке, добавив элемент spinBox.
В файл main.cpp добавьте подчеркнутую строку:
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.move(400, 250); // перемещает окно к центру экрана w.show(); return a.exec(); }
В файлe dialog.h в описание класса добавьте подчеркнутые строки:
#ifndef DIALOG_H #define DIALOG_H #include namespace Ui { class Dialog; } class MainWindow; // С помощью этого класса объявим указатель на родительское окно class Dialog : public QDialog { Q_OBJECT public: // Измените тип указателя на MainWindow explicit Dialog(MainWindow *parent = 0);
Dialog(); MainWindow* Parent; /* С помощью этого указателя диалоговое окно будет передавать новое значение цвета главному окну */ // объявление слота, который будет передавать новое значение цвета главному окну: publicslots: voidsetN(int); private: Ui::Dialog *ui; }; #endif // DIALOG_H
В файл dialog.cpp добавьте подчеркнутые строки:
#include "dialog.h" #include "ui_dialog.h" #include "mainwindow.h" // обеспечивает возможность использования класса MainWindow Dialog::Dialog(MainWindow*parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); ui->spinBox->setRange(0, 255); // Задаем диапазон изменнения значений наборного счетчика ui->spinBox->setSingleStep(5); // при щелчке по стрелочке значение счетчика будет изменяться на 5 Parent = parent; // Указатель, объявленный в классе, становится равным значению локального указателя ui->spinBox->setValue(Parent->n); /* Устанавливаем начальное значение счетчика так, чтобы оно было равно начальному значению цвета, установленного в конструкторе главного окна */ connect(ui->spinBox, SIGNAL(valueChanged(int)),
this, SLOT(setN(int))); /* связываем сигнал об изменении значения счетчика со слотом, который передает новое значение цвета главному окну */ } Dialog::
Dialog() { delete ui; } void Dialog::setN(int n) /* значение n автоматически передается слоту от наборного счетчика с помощью сигнала valueChanged(int) { Parent->n = n; // передаем значение цвета переменной, объявленной в классе гланого окна Parent->update(); // посылаем сигнал «перерисовать окно» }
Добавьте в файл mainwindow.h подчеркнутые строки:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "dialog.h" // Обеспечивает возможность использования класса Dialog #include // обеспечивает возможность использования графических функций namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0);
MainWindow(); void paintEvent(QPaintEvent *); // функция, которая автоматически вызывается при перерисовывании окна Dialog* dlg; // объект, описывающий диалоговое окно int n; // значение яркости цвета private: Ui::MainWindow *ui; private slots: void on_actionDialog_triggered(); }; #endif // MAINWINDOW_H
В режиме проектирования формы с помощью редактора действий добавьте действие actionDialog с текстом «Диалог» (это будет командой меню, которая вызывает вспомогательное диалоговое окно).
В файл mainwindow.cpp добавьте код, показанный ниже:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); n = 100; // начальное значение цвета dlg = new Dialog(this); // создаем объект класса Dialog ui->menuBar->addAction(ui->actionDialog); // В меню создаем кнопку, соответствующую команде «Диалог» (без выпадающего меню) } MainWindow::
MainWindow() { delete ui; } // В режиме проектирования формы добавьте слот для действия actionDialg: void MainWindow::on_actionDialog_triggered() { dlg->move(400+width(), 250); // размещаем диалоговое окно на правой границе главного окна dlg->show(); // рисуем окно на экране dlg->activateWindow(); // делаем диалоговое окно активным } // Описываем, что нужно нарисовать в окне void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this);// Объект для рисования QString str = QString::number(n);/* Строка, с помощью которой на экране будет отображаться текущая яркость цвета */ painter.drawText(20,70, str);// Отображаем на экране значение яркости цвета QBrush brush(QColor(n,0,0));/* объявляем кисть, число n в данном случае будет опреелять яркость красного цвета */ painter.setBrush(brush);// побключаем кисть QPolygonF polygon; // Объявляем многоугольник qreal r = 100; // радиус окружности, в которую будет вписан многоугольник qreal x0 = 200, y0 = 150; // центр окружности qreal dfi = M_PI / 3; // угол между вершинами 6-угольника for (int i = 0; i< 6; ++i) // рисуем 6-угольник { qreal fi = dfi * i; // угол, соответствующий очередной вершине // определяем координаты вершины qreal x = x0 + r*cos(fi); qreal y = y0 + r*sin(fi); polygon << QPointF(x,y);// добавляем координаты вершины к полигону } painter.drawPolygon(polygon);// рисуем многоугольник (6-угольник) }
Пример 2: программа, которая расчерчивает окно правильными 6-угольниками («пчелиными сотами»); размер шестиугольника — 1 / 5 меньшей стороны окна (но не меньше 2); при щелчке мышью внутри шестиугольника, он закрашивается цветом, выбранным с помощью специального окна для выбора цвета.
Создайте приложение на базе главного окна. В файле mainwindow.h добавьте объявления как показано ниже.
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #define maxR 500 // максимальное количество строк #define maxC 700 // максимальное количество столбцов namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0);
MainWindow(); void paintEvent(QPaintEvent *); // автоматически вызывается при перерисовке окна void createMatrices(); // функция, размещающая в памяти матрицы полигонов и регионов void createNet(); // формирование сетки в рабочей области окна void createPolygon(int, int); // создание одной ячейки с заданными номерами void mousePressEvent(QMouseEvent *); // автоматически вызыватся при щелчке мышью void resizeEvent(QResizeEvent *); // автоматически вызывается при создании окни и при изменении его размеров QPolygon** Polygon; // Указатель на матрицу полигонов QRegion** Region; // Указатель на матрицу областей QColor Color[maxR][maxC]; /* матрица для хранения цвета в каждой ячейке, она должна быть максимальных размеров, поскольку мы заранее не знаем размеры окна */ int previousRows, rows, columns; /* количество строк для предыдущего состояния окна, текущее количество строк, количество столбцов */ double w, h; // размеры рабочего поля double size, x0, y0, r; // размер одной ячейки, центр и радиус окружности, в которую вписан многоугольник QBrush brush; // кисть private: Ui::MainWindow *ui; private slots: void on_actionOpen_triggered(); void on_actionSave_triggered(); }; #endif // MAINWINDOW_H
В файле mainwindow.cpp напишите код, показанный ниже:
#include "mainwindow.h" #include "ui_mainwindow.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); for (int i = 0; i < maxR; ++i) for (int j = 0; jMainWindow() { delete ui; } // Виртуальная функция, которая вызывается при изменении размеров окна void MainWindow::resizeEvent(QResizeEvent * ) { w = width(); // ширина рабочего поля y0 = centralWidget()->y(); // Верхняя граница клиентской области h = height() - y0; // высота рабочего поля size = qMin(w, h) / 5; // размер одной ячейки (расстояние между двумя противоположными вершинами) if (size<2) size = 2; // размер не может оказаться равным нулю, чтобы не произошло деление на ноль // qDebug() << "size = " << size; r = size/2; // радиус окружности, в которую вписана ячейка x0 = r * sqrt(3)/2; // расстояние от левой границы окна до центра первого 6-угольника (красная линия на рисунке) /* длина стороны правильного 6-угольника = r, а расстояние между ценрами ячеек (вертикальный катет светлого треугольника) = r+r/2 = 3*r / 2 */ rows = int(2*h/(3*r)) +2; // количество полных рядов равно частному от деления высоты рабочей области на расстояние между центрами ячеек; к этому количеству нужно добавить 2 — неполные ряды на верхней и нижней границах окна if (rows>maxR) rows = maxR; // но количество рядов не может превышать задданый максимум // qDebug() << "rows = " << rows; columns = int(w / (r*sqrt(3)))+2; /* расстояние между центрами окружностей по горизонтали = (r*sqrt(3)/2) * 2 = r*sqrt(3), количество столбцов равно частному от деления ширины окна на расстояние между рядами + 2 неполных ряда на левой и правой границе */ if (columns>maxC) columns = maxC; // количество столбцов неможет превышать заданный максимум // qDebug() << "columns = " < void MainWindow::paintEvent(QPaintEvent * ) { QPainter painter(this); // рисуем многоугольники цветом, который записан в матрице цветов: for (int i = 0; i < rows; ++i) for (int j = 0; j < columns; ++j) { painter.setBrush(QBrush(Color[i][j])); painter.drawPolygon(Polygon[i][j]); } } // размещаем матрицы в памяти: void MainWindow::createMatrices() { if (previousRows) // удаляем предидущие матрицы из памяти, если они ненулевого размера { for (int i = 0; i < previousRows; ++i) // освобождаем память по строкам { delete[] Polygon[i]; // освобождаем память, выделенную для данных delete[] Region[i]; } delete Polygon; // удаляем массивы указателей delete Region; } previousRows = rows; // запоминаем текущее количество строк // создаем массивы указателей на строки данных: Polygon = new QPolygon* [rows]; Region = new QRegion* [rows]; // захватываем память для строк данных: for (int i = 0; i < rows; ++i) { Polygon[i] = new QPolygon[columns]; // для координат 6-угольников Region[i] = new QRegion[columns]; // для областей } } void MainWindow::createNet() // заполняем матрицы данными { double dx = r*sqrt(3); // расстояние между центрами ячеек по горизонтали double dy = r*3 / 2; // расстояние между центрами ячеек по вертикали for (int i = 0; i pos(); // координаты курсора мыши // проверяем, в какой регион (в какой 6-угольник) попадает курсор мыши for (int i = 0; i> Color[i][j]; // считываем цвет ячейки file.close(); } /* Главное окно приложения автоматически перерисовывается при закрытии окна для выбора файла */ }
Задания для самостоятельного выполнения
-
Создать приложение, которое расчерчивает окно правильными шестиугольниками (размер – 1/20 высоты окна) и при щелчке мышью в шестиугольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой ячейке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
2. Создать приложение, которое расчерчивает окно косой сеткой (линиями под углом 45 градусов, расстояние между линиями – 1/20 высоты окна) и при щелчке мышью в ромбе закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой ячейке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
3. Создать приложение, которое расчерчивает окно прямоугольной сеткой (линиями, параллельными сторонам окна, расстояние между линиями – 1/20 меньшей стороны окна) и при щелчке мышью в прямоугольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой ячейке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
4. Создать приложение, которое заполняет окно несколькими рядами окружностей (радиус окружности – 1/20 меньшей стороны окна) и при щелчке мышью в окружности закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой окружности пользователь щелкнул мышью, выполнять с помощью областей QRegion!
5. Создать приложение, которое заполняет окно несколькими рядами равносторонних треугольников (высота треугольника - 1/10 высоты окна) и при щелчке мышью в треугольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в каком треугольнике пользователь щелкнул мышью, выполнять с помощью областей QRegion!
6. Создать приложение, которое заполняет окно несколькими рядами вертикально стоящих ромбов (высота ромба в 2 раза больше ширины) и при щелчке мышью в ромбе закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в каком ромбе пользователь щелкнул мышью, выполнять с помощью областей QRegion!
7. Создать приложение, которое заполняет окно несколькими рядами правильных 5-угольников (выпуклых) и при щелчке мышью в 5-угольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в каком 5-угольнике пользователь щелкнул мышью, выполнять с помощью областей QRegion!
8. Создать приложение, которое заполняет окно несколькими рядами пятиконечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
9. Создать приложение, которое заполняет окно несколькими рядами 6-конечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
10. Создать приложение, которое заполняет окно несколькими рядами 7-конечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
11. Создать приложение, которое заполняет окно несколькими рядами 8-конечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
Лабораторная работа № 9
1 2 3 4 5 6 7
Тема: «Области отсечения»
Пример 1: программа, которая рисует 6-угольник, цвет которого можно изменять с помощью немодального диалогового окна с наборными счетчиками (Spin). Диалоговое окно появляется при нажатии кнопки «Диалог».
Создайте проект на базе главного окна.
Д обавьте дочернее диалоговое окно, описываемое классом Dialog (выберите в меню Файл | Новый файл или проект... , в появившемся диалоговом окне выберите Qt | Класс формы Qt Designer).
Спроектируйте окно как показано на рисунке, добавив элемент spinBox.
В файл main.cpp добавьте подчеркнутую строку:
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.move(400, 250); // перемещает окно к центру экрана w.show(); return a.exec(); }
В файлe dialog.h в описание класса добавьте подчеркнутые строки:
#ifndef DIALOG_H #define DIALOG_H #include namespace Ui { class Dialog; } class MainWindow; // С помощью этого класса объявим указатель на родительское окно class Dialog : public QDialog { Q_OBJECT public: // Измените тип указателя на MainWindow explicit Dialog(MainWindow *parent = 0);
Dialog(); MainWindow* Parent; /* С помощью этого указателя диалоговое окно будет передавать новое значение цвета главному окну */ // объявление слота, который будет передавать новое значение цвета главному окну: publicslots: voidsetN(int); private: Ui::Dialog *ui; }; #endif // DIALOG_H
В файл dialog.cpp добавьте подчеркнутые строки:
#include "dialog.h" #include "ui_dialog.h" #include "mainwindow.h" // обеспечивает возможность использования класса MainWindow Dialog::Dialog(MainWindow*parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); ui->spinBox->setRange(0, 255); // Задаем диапазон изменнения значений наборного счетчика ui->spinBox->setSingleStep(5); // при щелчке по стрелочке значение счетчика будет изменяться на 5 Parent = parent; // Указатель, объявленный в классе, становится равным значению локального указателя ui->spinBox->setValue(Parent->n); /* Устанавливаем начальное значение счетчика так, чтобы оно было равно начальному значению цвета, установленного в конструкторе главного окна */ connect(ui->spinBox, SIGNAL(valueChanged(int)),
this, SLOT(setN(int))); /* связываем сигнал об изменении значения счетчика со слотом, который передает новое значение цвета главному окну */ } Dialog::
Dialog() { delete ui; } void Dialog::setN(int n) /* значение n автоматически передается слоту от наборного счетчика с помощью сигнала valueChanged(int) { Parent->n = n; // передаем значение цвета переменной, объявленной в классе гланого окна Parent->update(); // посылаем сигнал «перерисовать окно» }
Добавьте в файл mainwindow.h подчеркнутые строки:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "dialog.h" // Обеспечивает возможность использования класса Dialog #include // обеспечивает возможность использования графических функций namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0);
MainWindow(); void paintEvent(QPaintEvent *); // функция, которая автоматически вызывается при перерисовывании окна Dialog* dlg; // объект, описывающий диалоговое окно int n; // значение яркости цвета private: Ui::MainWindow *ui; private slots: void on_actionDialog_triggered(); }; #endif // MAINWINDOW_H
В режиме проектирования формы с помощью редактора действий добавьте действие actionDialog с текстом «Диалог» (это будет командой меню, которая вызывает вспомогательное диалоговое окно).
В файл mainwindow.cpp добавьте код, показанный ниже:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); n = 100; // начальное значение цвета dlg = new Dialog(this); // создаем объект класса Dialog ui->menuBar->addAction(ui->actionDialog); // В меню создаем кнопку, соответствующую команде «Диалог» (без выпадающего меню) } MainWindow::
MainWindow() { delete ui; } // В режиме проектирования формы добавьте слот для действия actionDialg: void MainWindow::on_actionDialog_triggered() { dlg->move(400+width(), 250); // размещаем диалоговое окно на правой границе главного окна dlg->show(); // рисуем окно на экране dlg->activateWindow(); // делаем диалоговое окно активным } // Описываем, что нужно нарисовать в окне void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this);// Объект для рисования QString str = QString::number(n);/* Строка, с помощью которой на экране будет отображаться текущая яркость цвета */ painter.drawText(20,70, str);// Отображаем на экране значение яркости цвета QBrush brush(QColor(n,0,0));/* объявляем кисть, число n в данном случае будет опреелять яркость красного цвета */ painter.setBrush(brush);// побключаем кисть QPolygonF polygon; // Объявляем многоугольник qreal r = 100; // радиус окружности, в которую будет вписан многоугольник qreal x0 = 200, y0 = 150; // центр окружности qreal dfi = M_PI / 3; // угол между вершинами 6-угольника for (int i = 0; i< 6; ++i) // рисуем 6-угольник { qreal fi = dfi * i; // угол, соответствующий очередной вершине // определяем координаты вершины qreal x = x0 + r*cos(fi); qreal y = y0 + r*sin(fi); polygon << QPointF(x,y);// добавляем координаты вершины к полигону } painter.drawPolygon(polygon);// рисуем многоугольник (6-угольник) }
Тема: «Области отсечения»
Пример 1: программа, которая рисует 6-угольник, цвет которого можно изменять с помощью немодального диалогового окна с наборными счетчиками (Spin). Диалоговое окно появляется при нажатии кнопки «Диалог».
Создайте проект на базе главного окна.
Д обавьте дочернее диалоговое окно, описываемое классом Dialog (выберите в меню Файл | Новый файл или проект... , в появившемся диалоговом окне выберите Qt | Класс формы Qt Designer).
Спроектируйте окно как показано на рисунке, добавив элемент spinBox.
В файл main.cpp добавьте подчеркнутую строку:
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.move(400, 250); // перемещает окно к центру экрана w.show(); return a.exec(); }
В файлe dialog.h в описание класса добавьте подчеркнутые строки:
#ifndef DIALOG_H #define DIALOG_H #include namespace Ui { class Dialog; } class MainWindow; // С помощью этого класса объявим указатель на родительское окно class Dialog : public QDialog { Q_OBJECT public: // Измените тип указателя на MainWindow explicit Dialog(MainWindow *parent = 0);
Dialog(); MainWindow* Parent; /* С помощью этого указателя диалоговое окно будет передавать новое значение цвета главному окну */ // объявление слота, который будет передавать новое значение цвета главному окну: publicslots: voidsetN(int); private: Ui::Dialog *ui; }; #endif // DIALOG_H
В файл dialog.cpp добавьте подчеркнутые строки:
#include "dialog.h" #include "ui_dialog.h" #include "mainwindow.h" // обеспечивает возможность использования класса MainWindow Dialog::Dialog(MainWindow*parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); ui->spinBox->setRange(0, 255); // Задаем диапазон изменнения значений наборного счетчика ui->spinBox->setSingleStep(5); // при щелчке по стрелочке значение счетчика будет изменяться на 5 Parent = parent; // Указатель, объявленный в классе, становится равным значению локального указателя ui->spinBox->setValue(Parent->n); /* Устанавливаем начальное значение счетчика так, чтобы оно было равно начальному значению цвета, установленного в конструкторе главного окна */ connect(ui->spinBox, SIGNAL(valueChanged(int)),
this, SLOT(setN(int))); /* связываем сигнал об изменении значения счетчика со слотом, который передает новое значение цвета главному окну */ } Dialog::
Dialog() { delete ui; } void Dialog::setN(int n) /* значение n автоматически передается слоту от наборного счетчика с помощью сигнала valueChanged(int) { Parent->n = n; // передаем значение цвета переменной, объявленной в классе гланого окна Parent->update(); // посылаем сигнал «перерисовать окно» }Тема: «Области отсечения»
Пример 1: программа, которая рисует 6-угольник, цвет которого можно изменять с помощью немодального диалогового окна с наборными счетчиками (Spin). Диалоговое окно появляется при нажатии кнопки «Диалог».Создайте проект на базе главного окна.
Д обавьте дочернее диалоговое окно, описываемое классом Dialog (выберите в меню Файл | Новый файл или проект... , в появившемся диалоговом окне выберите Qt | Класс формы Qt Designer).
Спроектируйте окно как показано на рисунке, добавив элемент spinBox.
В файл main.cpp добавьте подчеркнутую строку:
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.move(400, 250); // перемещает окно к центру экрана w.show(); return a.exec(); }
В файлe dialog.h в описание класса добавьте подчеркнутые строки:
#ifndef DIALOG_H #define DIALOG_H #include
Добавьте в файл mainwindow.h подчеркнутые строки:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include
Пример 2: программа, которая расчерчивает окно правильными 6-угольниками («пчелиными сотами»); размер шестиугольника — 1 / 5 меньшей стороны окна (но не меньше 2); при щелчке мышью внутри шестиугольника, он закрашивается цветом, выбранным с помощью специального окна для выбора цвета.
Создайте приложение на базе главного окна. В файле mainwindow.h добавьте объявления как показано ниже.
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include
Задания для самостоятельного выполнения
-
Создать приложение, которое расчерчивает окно правильными шестиугольниками (размер – 1/20 высоты окна) и при щелчке мышью в шестиугольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой ячейке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
2. Создать приложение, которое расчерчивает окно косой сеткой (линиями под углом 45 градусов, расстояние между линиями – 1/20 высоты окна) и при щелчке мышью в ромбе закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой ячейке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
3. Создать приложение, которое расчерчивает окно прямоугольной сеткой (линиями, параллельными сторонам окна, расстояние между линиями – 1/20 меньшей стороны окна) и при щелчке мышью в прямоугольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой ячейке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
4. Создать приложение, которое заполняет окно несколькими рядами окружностей (радиус окружности – 1/20 меньшей стороны окна) и при щелчке мышью в окружности закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой окружности пользователь щелкнул мышью, выполнять с помощью областей QRegion!
5. Создать приложение, которое заполняет окно несколькими рядами равносторонних треугольников (высота треугольника - 1/10 высоты окна) и при щелчке мышью в треугольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в каком треугольнике пользователь щелкнул мышью, выполнять с помощью областей QRegion!
6. Создать приложение, которое заполняет окно несколькими рядами вертикально стоящих ромбов (высота ромба в 2 раза больше ширины) и при щелчке мышью в ромбе закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в каком ромбе пользователь щелкнул мышью, выполнять с помощью областей QRegion!
7. Создать приложение, которое заполняет окно несколькими рядами правильных 5-угольников (выпуклых) и при щелчке мышью в 5-угольнике закрашивает его цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в каком 5-угольнике пользователь щелкнул мышью, выполнять с помощью областей QRegion!
8. Создать приложение, которое заполняет окно несколькими рядами пятиконечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
9. Создать приложение, которое заполняет окно несколькими рядами 6-конечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
10. Создать приложение, которое заполняет окно несколькими рядами 7-конечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
11. Создать приложение, которое заполняет окно несколькими рядами 8-конечных звездочек и при щелчке мышью в звездочке закрашивает ее цветом, выбираемым с помощью немодального диалогового окна с наборными счетчиками (Spin), которые позволяют установить интенсивности красной, зеленой и синей составляющих цвета. Предоставьте возможность сохранять изображение в файле и считывать его из файла.
Проверку, в какой звездочке пользователь щелкнул мышью, выполнять с помощью областей QRegion!
Лабораторная работа № 9
Тема: «Работа с массивами с помощью класса QVector»
Пример: программа считывает массив неотрицательных чисел из файла, выводит его на экран, используя полосы прокрутки, и рисует круговую диаграмму для 13 самых больших элементов, отображая остальные в сумме.
Создайте проект на базе главного окна. Добавьте класс Pole, производный от QWidget. В главном окне создадим область прокрутки и поместим в эту область поле, на котором выведем массив и отображающую его круговую диаграмму.
В меню главного окна добавьте меню File и действие Open.
В файл mainwindow.cpp добавьте показанный ниже код.
#include "mainwindow.h" #include "ui_mainwindow.h" #include "pole.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QTextCodec* codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); QScrollArea* scroll = new QScrollArea(this); // создаем область прокрутки Pole* pole = new Pole(scroll); // создаем новый виджет scroll->setWidget(pole); // размещаем виджет в области прокрутки setCentralWidget(scroll); // делаем область прокрутки рабочей областью окна connect(ui->actionOpen, SIGNAL(triggered()), pole, SLOT(fileOpen())); // связываем вызов команды File|Open со слотом, который мы создадим в классе Pole } MainWindow::
MainWindow() { delete ui; }В файл pole.h добавьте показанный ниже код.
#ifndef POLE_H #define POLE_H #include
В файл pole.cpp добавьте показанный ниже код.
#include "pole.h" #include "mainwindow.h" Pole::Pole(QScrollArea* parent) : // измените тип указателя на родительское окно QWidget(parent) { Parent = parent; // запоминаем значение указателя } void Pole::paintEvent(QPaintEvent *) // отображаем массив на экране: { QPainter painter(this); int y = 20; // уровень, с которого начинается вывод массива на экран painter.setFont(font); // устанавливаем шрифт // Вывод массива: double sum = 0; // сумма элементтов массива k = v.size(); // размер массива for (int i = 0; i < k; ++i) // проходим по массиву { painter.drawText(10, y, QString::number(v[i])); // выводим очередной элемент массива на экран y += dy; // переходим на другую строку sum += v[i]; // добавляем элемент к сумме } copyV = v; // копируем массив, чтобы исходный массив отображался на экране без изменений qSort(copyV.begin(), copyV.end(), qGreater
Задания для самостоятельного выполнения
-
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран в столбик.
Значения элементов массива могут повторяться. Вывести на экран (перед массивом) наиболее часто повторяющийся элемент и количество его повторений. Если все элементы разные, вывести соответствующий текст.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести массив на экран в столбик.
Значения элементов массива могут повторяться. Вывести на экран самую длинную последовательность неповторяющихся элементов.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран.
Удалить один максимальный элемент и один минимальный. После этого найти среднее арифметическое оставшихся элементов и вывести его на экран.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран.
Если в массиве максимальный элемент повторяется, удалить из массива такие повторения, оставив только один максимальный элемент.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран.
Удалить из массива элементы, равные нулю. Вывести полученный массив на экран и среднее арифметическое оставшихся элементов.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран в столбик.
Поменять местами первый элемент с минимальным и вывести полученный массив на экран.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран в столбик.
Поменять местами последний элемент с максимальным и вывести массив на экран.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива могут иметь дробную часть и должны быть неотрицательными. Вывести исходный массив на экран.
Подсчитать количество целых четных элементов (вывести на экран).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран.
Найти первый элемент и его номер, такой что он отличается от максимального не более чем на 20%, но не равен ему.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран.
Найти элементы, значения которых больше среднего (вывести на экран эти элементы и их количество).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива могут иметь дробную часть и должны быть неотрицательными. Вывести исходный массив на экран.
Найти первый элемент, который является целым и степенью 10 (вывести на экран значение элемента и его номер).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива могут иметь дробную часть и должны быть неотрицательными. Вывести исходный массив на экран.
Найти последний элемент, который является целым и степенью двойки (вывести на экран значение и его номер).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть целыми и неотрицательными. Вывести исходный массив на экран.
Найти количество цифр максимального элемента (вывести на экран максимальный элемент и количество цифр).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть неотрицательными. Вывести исходный массив на экран.
Найти первый элемент, который является квадратом натурального числа (вывести на экран его значение и номер).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть целыми и неотрицательными. Вывести исходный массив на экран.
Найти первый элемент, содержащий цифру 7 (вывести на экран элемент и его номер).
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть целыми и неотрицательными. Вывести исходный массив на экран.
Определить, кратен ли максимальный элемент на минимальному.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть целыми и неотрицательными. Вывести исходный массив на экран.
Определить, кратна ли сумма элементов максимальному элементу массива.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть целыми и неотрицательными. Вывести исходный массив на экран.
Вывести на экран те элементы массива, которые являются простыми числами.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл. -
Создать приложение на основе главного окна с прокруткой, которое считывает массив типа QVector из файла. Элементы массива должны быть целыми и неотрицательными. Вывести исходный массив на экран.
Вывести на экран те элементы массива, которые являются числами Фибоначчи.
Затем отсортировать массив по убыванию, построить круговую диаграмму по первым 13 элементам, представив остальные в сумме. Отсортированный массив записать в файл.