- •Содержание
- •Лабораторная работа № 1 Тема: «Знакомство со средой Qt creator. Простые диалоговые приложения»
- •Пример 1: Программа, вычисляющая вещественный остаток от деления двух вещественных чисел
- •Пример 2: Программа, которая находит квадратный корень числа.
- •Пример 3: Программа, которая иллюстрирует использование стандартных сигналов и слотов.
- •Пример 4: Программа, которая вычисляет значение арифметического выражения
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 2 Тема: «Отладка программы»
- •Пошаговое выполнение программы
- •Задания для самостоятельного выполнения
- •Пример 2: программа, которая выводит значения функции на заданном отрезке с помощью списка listWidget
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 4 Тема: «Работа со строками» п ример 1: программа, которая переводит число из 16-ой системы в 10-ую. При вводе выполняется проверка вводимых символов.
- •Пример 2: программа, которая считывает строку символов, состоящую из русских букв, запятых и пробелов и выводит на экран множество символов этой строки.
- •Пример 3: программа, которая считывает текст из элемента tetxEdit и выводит в столбик числа, содержащиеся в тексте с помощью другого элемента типа textEdit.
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 5 Тема: «Главные окна. Меню. Работа с файлами» Пример 1: программа, которая считывает текст из файла и выводит его в главном окне; используется файл ресурсов.
- •Пример 2: программа, которая считывает текст из файла и половину строк переписывает в другой файл; используются специальные окна для работы с файлами.
- •Пример 3: программа, которая считывает текст из файла и подсчитывает количество видимых символов и количество русских букв.
- •Задания для самостоятельного выполнения
- •Пример 2: программа, в которой используется область отсечения qRegion и котекстное меню для выбора способа заливки этой области.
- •Задания для самостоятельного выполнения
- •Лабораторная работа № 7
- •Пример 1: программа, которая рисует траектории движения мыши при нажатой левой кнопке выбранным цветом и стирает рисунок при щелчке правой кнопкой мыши.
- •Пример 2: программа, которая рисует окружности с помощью мыши (окружность видима в процессе построения). Нарисованные окружности можно сохранить в файле и загрузить из файла.
- •Задания для самостоятельного выполнения
- •Задания для самостоятельного выполнения
- •Задания для самостоятельного выполнения
Задания для самостоятельного выполнения
Создать приложение, которое расчерчивает окно правильными шестиугольниками (размер – 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!
Лабораторная работа № 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 <QWidget>
#include <QtGui>
class Pole : public QWidget
{
Q_OBJECT
public:
explicit Pole(QScrollArea* parent = 0);
// измените тип указателя на родительское окно
QScrollArea* Parent; // указатель на область прокрутки
void paintEvent(QPaintEvent *); // перерисовывает содержимое окна
QFile file; // файл, содержащий массив
QString fileName; // имя файла
QVector<double> v; // массив
QVector<double> copyV; // копия массива
QFont font; // шрифт
int dy; // расстояние между элементами массива при выводе на экран
int k; // количество элементов массива
void Pie(QPainter&, QRect&, int, int, int);
// рисует один кусок диаграммы
signals:
public slots:
void fileOpen(); // слот, считывающий массив из файла
};
#endif // POLE_HВ файл 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<double>());
// сортируем копию массива по убыванию, чтобы построить диаграмму
// Диаграмма:
QRect rectBase = Parent->rect();
// прямоугольник, соответствующий видимой части области прокрутки
QRect rect = rectBase; // прямоугольник, в котором мы будем рисовать диаграмму
int h = rectBase.height()-25; // несколько уменьшим высоту прямоугольника
rect.setSize(QSize(h,h)); // задаем квадрат высотой h
rect.moveRight(rectBase.width()-25); // перемещаем квадрат к правой границе окна
double startAngle = 0; // начальный угол для первого фрагмента диаграммы
double spanAngle = 0; // угол,
for (int i = 0; i < qMin(13, k); ++i) //
{
spanAngle = 360 * 16.* copyV[i] / sum ; // Угол между радиусами
Pie(painter, rect, startAngle, spanAngle, i); //
startAngle += spanAngle; //
}
if (k > 13) //
{
spanAngle = 360*16 - startAngle; //
Pie(painter, rect, startAngle, spanAngle, 13); //
}
}
void Pole::fileOpen()
{
if (file.isOpen()) file.close();
v.clear(); //
copyV.clear(); //
fileName = QFileDialog::getOpenFileName(this, "Открыть файл", QString(),
QString("Текстовые файлы (*.txt);;Все файлы (*.*)")); //
if (!fileName.isEmpty()) //
{
file.setFileName(fileName); //
file.open(QIODevice::ReadOnly); //
QTextStream in(&file); //
double x; //
while (true) //
{
in >> x; //
if (x < 0) //
{
QMessageBox::critical(this, "Ошибка в данных",
"Все числа должны быть больше 0");
return;
}
if (!in.atEnd()) //
v << x; //
else break; //
}
font = QFont("Serif", 12); //
QFontMetrics fm(font); //
dy = fm.height(); //
k = v.size(); //
int height = qMax(1500, 20 + k*dy); //
this->resize(1500, height); //
}
}
void Pole::Pie(QPainter & painter,QRect& rect, int startAngle, int spanAngle, int i)
{ //
int c = i+1; //
int I, R,G,B; //
B = c % 2; c /= 2; //
G = c % 2; c /= 2; //
R = c % 2; c /= 2; //
I = c % 2; //
painter.setBrush(QBrush(QColor(I*100+R*155,I*100+G*155,I*100+B*155))); //
painter.drawPie(rect, startAngle, spanAngle); //
}
