Объектно-ориентированное программирование и проектирование
Темы лекции
Кроссплатформенное программирование
Qt
История
Qt Creator & C++
moc
Сигналы и слоты
Сигналы и слоты
Философия объектной модели. �
Иерархия классов Qt
Основные модули Qt�
Иерархия классов Qt
Структура проекта
Структура проекта
Компиляция проекта�
Настройка компилятора pro-файл
Простейшее консольное приложение. Выбор типа проекта:�Файл/Новый файл или проект
Простейшее консольное приложение. Файл профиля проекта�
QApplication
Пример консольного приложения c QCoreApplication
#include <QCoreApplication>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
/*создаётся объект класса QAplication, котрый осуществляет контроль и управление приложением*/
QCoreApplication a(argc, argv);
int x [4];
for (int i=0; i<4; i++) x[i]=i*10-5;
for (int i=0; i<4; i++) cout <<"x["<<i<<"]="<< x[i]<<endl;
return a.exec(); // приложение запускается (обработка событий)
}
Модуль QtCore �
Простейшее графическое приложение. Создать
Простейшее графическое приложение
#include <QtWidgets>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QLabel lbl ("Hello, World !");
lbl.show ( ) ;
return app.exec ( );
}
Создание графического интерфейса�
Виджеты
Формы Qt
Сигналы и слоты
Сигналы и слоты
файл main.cpp и окно отладки
PyQt
Установка:
pip install PyQt5
Преобразование форм Qt в Python:
pyuic5 name_of_input.ui -o name_of_output.py
Импорт формы в Python
from PyQt5 import QtWidgets, uic
from form1 import * #это наш файл из Qt
Пример импорта формы PyQt
Класс QString
Класс QString
Функция | Описание | Пример |
append | Добавление к строке справа строки. | s="one";�s.append(" two"); // "one two" |
clear | Очищает содержимое строки. | s.clear(); |
size | Количество символов в строке | s="itmath";�int n=s.size(); //5 |
contains | true, если строка содержит данную строку. Чувствительность к регистру определяется вторым параметром. | s="Abc Def"; s.contains("dEf", Qt::CaseInsensitive); //true |
length | Количество символов в строке | s="test"; s.length(); //4 |
truncate | Удаление окончания строки с указанного символа | s="abcdel"; s.truncate(3); //"abc" |
indexOf | Номер позиции первого вхождения строки в данную строку. Можно указать, с какой позиции искать. Возвращает -1, если строки не найдена. | s="test line best";�s.indefOf("est"); // 1�s.indexOf("est",5); //10 |
Класс QString
Функция | Описание | Пример |
split | Разбиение строки на фрагменты. Обратная операция: QStringList::join(QChar sep) | s="a,,,,,b,c";�QStringList w=s.split(",", QString::SkipEmptyParts); // ["a","b","c"] |
insert | Вставка строки в заданную позицию | s="QtStyle"; s.insert(2,"C++"); //QtC++Style |
isEmpty | Проверка на пустую строку | |
prepend | Добавление строки или символа в начало данной строки | s="def";�s.prepend("abc"); //abcdef |
remove | Удаление фрагмента с указанной позиции заданной длины, удаление всех вхождений данного символа или строки (с учетом настроек чувствительности к регистру) | s="example"; s.remove(1,4); //"ele"�s="abcA"; s.remove(QChar('a'), Qt::CaseInsensitive); //"bc" |
replace | Замена фрагмента, заданный позицией и количеством символом, на данную строку. Есть еще вариант вызова для замены всех вхождений. | s="It math";�s.replace(3,4,"c++"); //"it c++" |
Класс QString
Функция | Описание | Пример |
setNum | Перевод переданного числа в строковое представление. | s.setNum(2015); //"2015" |
toDouble | Конвертация строки в действительное число типа double. | s="12.34"; double d=str.toDouble(); //12.34 |
toInt | Конвертация строки в целое число в данной системе счисления (по умолчанию 10). | s="123"; bool flag; int n=s.toInt(&flag); if (flag) { //success }; |
toLower | Перевод всех символов в нижний регистр | |
toUpper | Перевод всех символов в верхний регистр | |
Класс QString. Пример: работа с числами
//преобразование целого числа в строку
int x = 1+6;
QString lXStr = QString::number ( x ); // x = 7; lXStr = 7
//преобразование строки в целое число
int y = lXStr.toInt ( );
//преобразование дробного числа в строку
double teta = 12099.10012021210102109991;
QString lTetaStr = QString::number ( teta ); // lTetaStr == 12099.1
lTetaStr.setNum ( teta ); // lTetaStr == 12099.1
//вывод с 4-мя знаками после запятой
lTetaStr = QString::number ( teta, " f ", 4 ); // lTetaStr == 12099.1001
//форматирование с использованием символа "e"
lTetaStr = QString::number ( teta, " e " ); // lTetaStr == 1.209910e+04
Пример работы с QString
#include <QCoreApplication>
#include <QString>
#include <QTime>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str1 = "Hello World! ";
QString str2 = "Now is ", str3=" o'clock now";
QTime time=QTime::currentTime();
qDebug()<<str1+str2<< time.toString()+str3;
return a.exec();
}
Потоки QTextStream
#include <QTextStream>
#include <QString>
int main(int argc, char *argv[])
{
QTextStream out(stdout);
QTextStream in(stdin);
out << "Enter your name: " << flush;
QString value = in.readLine();
out << "Hello " << value << endl;
out << "Enter two numbers: " << flush;
int num1;
int num2;
in >> num1;
in >> num2;
out << "You entered " << num1 << " and " << num2 << endl;
}
Контейнерные классы Qt
QList | Список общего назначения |
QLinkedList | Cвязный список в Qt. Отсутствует операция доступа по индексу элемента |
QVector | Реализует вектор элементов в Qt. |
QStack | Реализует стек. |
QQueue | Реализует очередь. |
QSet | Множество элементов. |
QMap | Контейнерный класс для словаря. Элементы добавляют парами: ключ-значение |
QMultiMap | Контейнерный класс словаря, чтобы каждому ключу соответствовало несколько значений |
QHash | Контейнерный класс для хеша. Элементы добавляют парами: ключ — значение. Позволяет выполнять очень быстрый поиск элемента по ключу. |
QMultiHash | Контейнерный класс хеша, создан для удобной работы с тем, чтобы каждому ключу соответствовало несколько значений. |
Двумерный массив в QVector
#include <QCoreApplication>
#include <QVector>
#include <QDebug>
//+++++++++++++++++++++++++++++++++++++++++++
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector <QVector <int> > myVector;
int massive[4][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16} };
for(int i = 0; i < 4; i++)
{
QVector<int> tempVector;
for(int j = 0; j < 4; j++)
{
tempVector.push_back(massive[i][j]);
qDebug() << "Value " << j << ": " << tempVector.value(j);
}
myVector.push_back(tempVector);
qDebug() << "myVector " << i << ": " << myVector.value(i);
}
return a.exec();
}
Работа с файлами
#include <QDebug>
#include <QFile>
int main ( int arg c, char * argv [ ] )
{
const QString lFileName ( " file.txt " );
if ( ! QFile::exists ( lFileName ) ) //Проверяем существование файла
{qCritical ( " File % s does not exists." ,
qPrintable ( lFileName ) );
return 1;}
QFile lFile;
lFile.setFileName ( lFileName ); //Устанавливаем имя файла
//Открываем файл — текстовый, только для чтения
if ( ! lFile.open ( QIODevice::ReadOnly | QIODevice::Text ) )
{qCritical ( " Error % d : % s.", lFile.error ( ) ,qPrintable ( lFile.errorString ( ) ) ); //открыть файл не удалось
return 2; }
while ( ! lFile.atEnd ( ) ) //Пока можно прочесть строку
{qDebug ( ) << lFile.readLine ( );} // ... выводить её в консоль
lFile.close ( ); //Заканчиваем работу с файлом
return 0;
}
Задание
Литература к лекции