Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1





НазваниеРеферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1
страница3/6
Дата публикации08.03.2015
Размер0.89 Mb.
ТипРеферат
100-bal.ru > Математика > Реферат
1   2   3   4   5   6

if (consPrevName == consName){

boundRect->setParentItem(constellation);

}

else{

constellation = new Constellation(consName,QColor(Qt::white));

scene->addItem(constellation);

constellation->setPos(Line[9].x1(),Line[9].y1());

}
В конце метода парсим ini-файл текущей позиции и по необходимости вносим изменения.

file.setFileName("coord.ini");

if (!file.open(QIODevice::ReadOnly)) {

qDebug() << "Ошибка открытия для записи";

}

QVariant dHstr = H;

QVariant dGstr = G;

QByteArray descr = file.readLine();

QByteArray ArrAscension = file.readLine();

QByteArray ArrDeclination = file.readLine();

file.close();

if (!file.open(QIODevice::ReadWrite)) {

qDebug() << "Ошибка открытия для записи";

}

QVariant AscValOld = ArrAscension;

QString StrAscValStrOld = AscValOld.toString();

AscValOld = StrAscValStrOld.mid(StrAscValStrOld.indexOf("=")+1,StrAscValStrOld.indexOf(";")-StrAscValStrOld.indexOf("=")-1);

int intAscValOld = AscValOld.toInt();

AscValOld = intAscValOld;

ArrAscension.replace(AscValOld.toByteArray(),dHstr.toByteArray());
Для этого выделяем необходимый интервал в файле и заменяем старое значение на новое.
Слот setValue вызывает заполнение сцены с новыми значениями:

void MainWindow::setValue(int nValue1, int nValue2){

populateScene(nValue1,nValue2);

update();

}
1.3.3. View

Основной класс, взаимодействующий с пользователем. Посмотрим на заголовочный файл:

class View : public QFrame

{

Q_OBJECT

public:

View(const QString &name, QWidget *parent = 0);

QGraphicsView *view() const;
protected:

void mousePressEvent(QMouseEvent *event);

void mouseMoveEvent(QMouseEvent *event);

void mouseReleaseEvent(QMouseEvent *event);

void keyPressEvent(QKeyEvent *event);

void wheelEvent(QWheelEvent *event);

void timerEvent(QTimerEvent*);

void paintEvent(QPaintEvent *);

bool eventFilter(QObject* pobj, QEvent* pe);
private slots:

void resetView();

void setResetButtonEnabled();

void setupMatrix();

void goToNextItem();

void toggleFullScreen();

void toggleOpenGL();

void toggleAntialiasing();

void toggleShowRule();

void searchStar();

void searchConstellation();

void setGMT();
void zoomIn();

void zoomOut();

void rotateLeft();

void rotateRight();
void about();

void quit();
signals:

void valueChanged(int nValue1, int nValue2);
private:

QGraphicsView *graphicsView;

QLabel *label;

QToolButton *nextItemButton;

QToolButton *searchButton;

QToolButton *resetButton;

QSlider *zoomSlider;

QSlider *rotateSlider;

QToolButton *rotateLeftIcon;

QToolButton *rotateRightIcon;

QToolButton *zoomInIcon;

QToolButton *zoomOutIcon;

QToolButton *menuButton;

QToolButton *hourButton;

QMenu *searchMenu;

QMenu *menu;

QAction* FullScreen;

QAction* Antialising;

QAction* OpenGl;

QAction* showRule;

QAction* showCons;

int timerId;

int rotateCount;

bool rotateL;

bool nextItem;

int itemsCount;

QGraphicsView *compView;

};
Класс имеет event filter, перехватывающий все события. Предусмотрена возможность задания событий на кнопки мыши и клавиатуры, если фильтр не нашёл обработчика данного события.

Имеется возможность изменять настройки виджета извне, для этого создана публичная ссылка QGraphicsView *view().

Введены слоты для кнопок и слот настройки матрицы текущего вида. Имеется сигнал valueChanged для отправки сообщения MainWindow, полученного от класса InputDialog.

В приватных переменах содержатся классы элементов управления, а так же счётчики и флаги для анимации поворота и передвижения по карте.

Для простоты навигации внутри графического представления View создаётся ещё одно, которое содержит объект компаса (QGraphicsView *compView).
Посмотрим на реализацию класса.

Не все устройства имеют поддержку библиотеки OpenGL, по этому, при компилировании под неподдерживаемое устройство необходимо убрать подключение данной библиотеки.

Чтобы программа корректно обработала соответствующие функции в программе, напишем следующий вид подключения:

#include

#ifndef QT_NO_OPENGL

#include

#endif
При исключении из .pro файла OpenGL прагма #ifndef запретит подключать данную библиотеку.

Настройки виджета создаются в конструкторе класса:

setFrameStyle(Sunken | StyledPanel);

graphicsView = new QGraphicsView;

graphicsView->setRenderHint(QPainter::Antialiasing, false);

graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);

graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);

graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

graphicsView->setBackgroundBrush(QBrush(QColor(Qt::black)));

graphicsView->setCacheMode(QGraphicsView::CacheBackground);

graphicsView->setFocus();

graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);
Конструктор создаёт новый экземпляр класса. Отключает поддержку Antialiasing по умолчанию. При перерисовке, не сохраняет настройки кисти и заливки (нет необходимости вызывать методы save и restore), флаг SmartViewportUpdate указывает программе перерисовывать только видимую часть сцены. ScrollBarAlwaysOff выключает полосы прокрутки, setBackgroundBrush задаём цвет фона, устанавливаем фокус setFocus на виджете, включаем режим навигации по карте путём перемещения указателя мыши с нажатой левой клавишей.

Создание компаса выглядит следующим образом:

compView = new QGraphicsView;

QGraphicsScene *comp = new QGraphicsScene;

QGraphicsEllipseItem *compEllipse = comp->addEllipse(-9,-9,18,18,QPen(QColor(Qt::black),0),QBrush(QColor(Qt::lightGray)));

QGraphicsLineItem *S = comp->addLine(0,0,0,9,QPen(QColor(Qt::red),2));

QGraphicsLineItem *N = comp->addLine(0,-9,0,0,QPen(QColor(Qt::blue),2));

S->setParentItem(compEllipse);

N->setParentItem(compEllipse);

compView->setFixedSize(25,25);

compView->setFrameShadow(QFrame::Plain);

compView->setLineWidth(0);

compView->setMidLineWidth(0);

compView->setFrameShape(QFrame::NoFrame);

compView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

compView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

compView->setScene(comp);
Настройки фрейма компаса задаются в минималистическом стиле, чтобы выдавать изображение без лишних рамок и стилей обрамления границ графического представления.
Класс View создаёт 3 боковых панели в которых устанавливает элементы управления.

QVBoxLayout *zoomSliderLayout = new QVBoxLayout;

zoomSliderLayout->addWidget(zoomSlider);

zoomSliderLayout->addWidget(zoomInIcon);

zoomSliderLayout->addWidget(zoomOutIcon);

QHBoxLayout *rotateSliderLayout = new QHBoxLayout;

rotateSliderLayout->addWidget(compView);

rotateSliderLayout->addWidget(rotateSlider);

rotateSliderLayout->addWidget(rotateLeftIcon);

rotateSliderLayout->addWidget(rotateRightIcon);

rotateSliderLayout->addWidget(resetButton);

QHBoxLayout *labelLayout = new QHBoxLayout;

labelLayout->addWidget(label);

labelLayout->addWidget(menuButton);

labelLayout->addStretch();

labelLayout->addWidget(hourButton);

labelLayout->addWidget(nextItemButton);

labelLayout->addWidget(searchButton);
Все 3 панели устанавливаются в главный слой, который располагает их в нужном порядке:

QGridLayout *topLayout = new QGridLayout;

topLayout->addLayout(labelLayout, 0, 0);

topLayout->addWidget(graphicsView, 1, 0);

topLayout->addLayout(zoomSliderLayout, 1, 1);

topLayout->addLayout(rotateSliderLayout, 2, 0);

setLayout(topLayout);
Соединение кнопок происходит с помощью moc-команды connect:

connect(resetButton, SIGNAL(clicked()), this, SLOT(resetView()));
В конце конструктора устанавливаем начальное изображение вида с помощью слота setupMatrix().
Метод timerEvent осуществляет анимацию поворота и перехода к следующей звезде.

if(timerId!=0){

if (rotateL){

rotateSlider->setValue(rotateSlider->value() - 50+rotateCount);

rotateCount++;

if (rotateCount==50){

killTimer(timerId);

timerId = 0;

rotateCount=1;

rotateL = false;

rotateLeftIcon->setEnabled(true);

}

}

if(nextItem){

graphicsView->centerOn(graphicsView->items().at(0)->pos().x(), graphicsView->items().at(0)->pos().y());

graphicsView->items().at(0)->setPos(graphicsView->items().at(0)->pos()+(QPointF(graphicsView->items().at(itemsCount)->pos())-graphicsView->items().at(0)->pos())/(40));

rotateCount++;

if (rotateCount==200){

killTimer(timerId);

timerId = 0;

rotateCount=1;

nextItem = false;

nextItemButton->setEnabled(true);

}

}

}
При нажатии на кнопку поворота влево происходит затухающее изменение ползунка поворота. При нажатии кнопки Next, вид центрируется на «камере», созданной в классе MainWindow, далее вычисляется вектор направления, и по нему с затухающей скоростью движется «камера» до достижения малой окрестности выбранной itemsCount звезды.
Слот установки текущего вида выглядит следующим образом:

void View::setupMatrix()

{
qreal scale = qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50));

if (rotateSlider->value() != 0){

graphicsView->setDragMode(QGraphicsView::RubberBandDrag);

}

else {

graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);

setResetButtonEnabled();

}
QMatrix matrix;

matrix.scale(scale, scale);

matrix.rotate(qreal(rotateSlider->value())/100);

graphicsView->setMatrix(matrix);

QMatrix compasMatrix;

compasMatrix.rotate(qreal(rotateSlider->value())/100);

compView->setMatrix(compasMatrix);

}
Переменная scale увеличения/уменьшения вида вычисляется по следующей формуле:



Что даёт естественное изменение при приближении и отдалении от 1 (вид сцены 1:1, положение ползунка на позиции 250).

Создаём матрицу трансформации вида, поворачиваем её на текущий угол и зумируем на значение scale.

Для компаса только необходимо повернуть матрицу.

Посмотрим реализацию слота кнопки перехода к следующей звезде:

void View::goToNextItem(){

graphicsView->items().at(0)->setPos(graphicsView->items().at(itemsCount)->pos());

itemsCount++;

if (graphicsView->items().at(itemsCount)->data(2)!="star")

itemsCount = 74;

nextItem = true;

timerId=startTimer(13);

nextItemButton->setDisabled(true);

}

Устанавливаем «камеру» на текущей позиции. Увеличиваем счётчик звёзд. Если блок item’ов типа «star» закончен, то возвращаем значение счётчика в начальную позицию. Запускаем таймер и отключаем кнопку до прибытия «камеры» к следующей звезде.
Следующий слот вызывает диалоговое окно смены вида:

void View::setGMT(){

bool bOk;

InputDialog* pInputDialog = new InputDialog;

pInputDialog->setWindowTitle("Changing view");

if (pInputDialog->exec() == QDialog::Accepted) {

int dH = pInputDialog->hour().toInt();

int dG = pInputDialog->grad().toInt();

emit valueChanged(dH, dG);

delete pInputDialog;

}

}
Создаём диалоговое окно, которое от пользователя получает переменные dH и dG, с помощью сигнала valueChanged посылаем их классу MainWindow для смены текущей позиции.

Слот toggleFullScreen меняет режим окна:

if (FullScreen->isChecked())this->parentWidget()->showFullScreen();

else{

this->parentWidget()->showMaximized();

#if defined(Q_WS_WIN) or (Q_WS_X11)

this->parentWidget()->setGeometry(200, 200, 640, 400);

#endif
Особенностью слота является проверка метаинформации на признак ОС, на которой запускается приложение. Для портативных устройств окно просто максимизируется, для настольных решений на базе Windows и Linux (с установленной графической подсистемой), окно принимает фиксированные размеры 640×400.

Слоты toggle проверяют признак нажатия кнопки и включают/отключают соответствующий режим:

void View::toggleOpenGL()

{

#ifndef QT_NO_OPENGL

graphicsView->setViewport(OpenGl->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);

compView->setViewport(OpenGl->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);

#endif

}
Слоты поиска:

  • звезды

bool bOk;

bool bSearched = false;

QString str = QInputDialog::getText(0, "Search the star", "The Star's Name:", QLineEdit::Normal, "alpha", &bOk );

if (!bOk) {

//cancel

}

else{int i;

for (i = 0; iitems().size() && !bSearched;i++)

if (graphicsView->items().at(i)->data(1)==str.toLower() && graphicsView->items().at(i)->data(2) == "star"){

zoomSlider->setValue(270);

graphicsView->centerOn(graphicsView->items().at(i));

bSearched = true;

}

if(!bSearched)

QMessageBox::information(0, "sorry", "The star with such name is not found");
Выводит стандартное диалоговое окно. Получает строку от пользователя. Преобразует её методом toLower в нижние литералы, сравнивая со всеми названиями объектов сцены, имеющими тип «star». При удачном поиске увеличивает и центрирует вид на найденной звезде, иначе выдаёт сообщение о неудаче.

  • созвездия

QString str = QInputDialog::getText(0, "Search the constellation", "The Constellations's Name:", QLineEdit::Normal, "cassiopea", &bOk );

if (!bOk) {

//cancel

}

else{int i;

for (i = 0; iitems().size() && !bSearched;i++)

if (graphicsView->items().at(i)->data(0)==str.toLower() && graphicsView->items().at(i)->data(1) == "constellation"){

zoomSlider->setValue(250);

rotateSlider->setValue(0);

graphicsView->fitInView(graphicsView->items().at(i)->childrenBoundingRect(),Qt::KeepAspectRatio);

zoomSlider->setValue(50*(qLn(graphicsView->matrix().m11())/qLn(2))+245);

bSearched = true;

}

if(!bSearched)

QMessageBox::information(0, "sorry", "The constellation with such name is not found");
Выводит стандартное диалоговое окно. Получает строку от пользователя. Преобразует её в нижние литералы, сравнивая со всеми названиями объектов сцены, имеющими тип «constellation». При удачном поиске сбрасывает положения ползунков. Это необходимо для получения корректных значений матрицы трансформации типа QMatrix, которая выглядит следующим образом (внутреннее представление имеет размерность 3×3):



За увеличение отвечают коэффициенты m11 и m22, однако они могут изменяться при повороте матрицы, поэтому необходим сброс параметров.

Найденное созвездие помещаем в окно с помощью метода fitInView, размер созвездия задаётся объединением множества всех ограничивающих прямоугольников (bounding rectagle). После данной процедуры необходимо задать значение ползунка зумирования, так как встроенный метод fitInView не вызывает слот setupMatrix, но изменяет показатели m11 и m22 в соответствии с реальным значением переменной scale (fitInView не производит поворот матрицы). Поэтому возможно вычислить положение ползунка взятием обратной функции к scale:



К логарифму добавляем число 250 - 5 для получения отступов от краёв окна до прямоугольника, ограничивающего созвездие.

Реализация фильтра событий:

При повороте вида, просмотр линейки затрудняется, поэтому будем убирать её в случаях изменения позиции ползунка поворота.

if (rotateSlider->value() == 0 && showRule->isChecked()) {

graphicsView->items().at(1)->show();

graphicsView->items().at(50)->show();

}

else

{

graphicsView->items().at(1)->hide();

graphicsView->items().at(50)->hide();

}
Чтобы линейка выглядела красиво, выделяя только центральные засечки, организуем подобие градиента через функцию setOpacity, которая будет делать прозрачными цифры по краям экрана.

qreal hSlidePosR = (graphicsView->horizontalScrollBar()->sliderPosition()+150*graphicsView->width()/191)/qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50));

for (int i=2; i<50;i++)

if (graphicsView->items().at(i)->data(0) == "ruler")

if (graphicsView->items().at(i)->pos().x()< hSlidePosRR && graphicsView->items().at(i)->pos().x() > hSlidePosLL)

graphicsView->items().at(i)->setOpacity(1);

else

if (graphicsView->items().at(i)->pos().x()< hSlidePosR && graphicsView->items().at(i)->pos().x() > hSlidePosL)

graphicsView->items().at(i)->setOpacity(0.7);

else

graphicsView->items().at(i)->setOpacity(0.3);

for (int i=51; i<75;i++)

if (graphicsView->items().at(i)->data(0) == "ruler")

if (graphicsView->items().at(i)->pos().y()< vSlidePosUU && graphicsView->items().at(i)->pos().y() > vSlidePosDD)

graphicsView->items().at(i)->setOpacity(1);

else

if (graphicsView->items().at(i)->pos().y()< vSlidePosU && graphicsView->items().at(i)->pos().y() > vSlidePosD)

graphicsView->items().at(i)->setOpacity(0.7);

else

graphicsView->items().at(i)->setOpacity(0.3);
Чтобы выделять центральные позиции, необходимо знать текущее положение вида в окне. Эти данные предоставляют классы horizontalScrollBar и VerticalScrollBar. Чтобы вычислить верную позицию нужно знать размер окна и положение ползунка увеличения. За единицу берётся значение увеличения 1 и размер окна 320×240. Общая формула выглядит так:



Обработчик скрытия/показа боковых панелей работает следующим образом:

if (pe->type() == QEvent::KeyPress) {

if (((QKeyEvent*)pe)->key() == Qt::Key_Up || ((QKeyEvent*)pe)->key() == Qt::Key_5) {

if (rotateSlider->isHidden()){

rotateSlider->show();

menuButton->setFocus();

}

else{

rotateSlider->hide();

}

}
Если перехваченное событие имеет тип KeyPress и оно равняется цифре 5 или стрелке вверх, то в зависимости от того скрыты или показаны панели, условие выполняет соответствующие действия показа/скрытия панелей.
1.3.4. Star

Класс, создающий звезду на карте звёздного неба. Наследуется от класса Qt QGraphicsItem, который добавляет элементы на сцену QGraphicsScene. Для корректного отображения перегружаются основные методы boundingRect (определение размера области перерисовки), shape (размер звезды для перехвата событий мыши) и paint (отрисовка звезды и её элементов).

В приватных переменных хранятся все данные о звезде.

Рассмотрим реализацию конструктора:

Star::Star(QString starData, int dH, int dG)

{

this->x = 0;

this->y = 0;

this->color = Qt::white;

this->starData = starData;

setZValue(10);
Берём входную строку и разбиваем её по элементам. Чтобы звёзды отображались не большими кругами, но сохраняли пропорции уменьшаем объем в 10 раз от реальных значений.

QTextStream stream(&starData);

volume = starData.right(3).toInt();

volume = qAbs(volume);

volume = volume/10;

starData.resize(starData.size()-3);
Считываем остальные характеристики:

stream >> id;

stream >> num;

stream >> raHour;

stream >> raMin;

stream >> raSec;

QString strPole;

stream >> strPole;

if(strPole == "+") south = true;

else south = false;

stream >> decGrad;

stream >> decMin;

stream >> decSec;

Координаты наклона имеют как отрицательные, так и положительные значения. Представим нашу плоскую систему координат аналогичным образом, 0 пройдёт через середину нашей плоскости.

if (south){

decGrad = -decGrad;

decMin = -decMin;

decSec = -decSec;

}

QString name1,name2;

stream >> name1;

stream >> name2;

name = name1 + name2;
Координаты x пересчитываются по следующей формуле (за единицу принимаем 1 сек):



Для замыкания плоскости по горизонтали, переносим координаты точки в начало, если он вышли за текущую область (см. Схему 1.3):
замыкание звёзд

Схема 1.3
Для пересчёта y используется следующая формула:



Переменную dG необходимо сразу перевести к осям плоских координат, чтобы вначале не накапливалась погрешность, если координаты звезды находятся в окрестности 0, в последствие чего сдвиг может произойти не равномерно. В случае часового пояса погрешность может накопиться лишь для координат 1-3 с, что будет визуально неотличимо (сделано намеренно, чтобы нагляднее показать работу алгоритма). Замыкание по вертикали происходит аналогично горизонтальной версии, с той лишь разницей, что область разбивается на 2 симметричных и на каждой перенос координат происходит с точностью до знака.

if (raHour+dH < 24)

x=(raHour+dH)*3600;

else

x = ((raHour+dH) - 24)*3600;

x+=raMin*60;

x+=raSec;

x=(x*3.14159)/12; //сдвиг по часам больше 1, п.э. всё ок
y = decGrad*3600;

y+=decMin*60;

y+=decSec;

y=(y*3.14159)/180;

qreal dGr = dG*62.8318;

if (dGr>=0)

if (y+dGr<90*62.8318)

y=y+dGr;

else

y=(y+dGr)-180*62.8318;

if (dGr<0)

if (y+dGr>-90*62.8318)

y=y+dGr;

else

y=(y+dGr)+180*62.8318;

setPos(x,y);
С помощью метода setData заводим массив из 3х ключей: идентификационный номер, название и тип.

QString strNme = name.toLower();

QVariant varId = id;

setData(0,varId.toString());

setData(1,strNme);

setData(2,"star");
Включаем возможность выделения звезды.

setFlags(ItemIsSelectable)

setAcceptsHoverEvents(true);
Устанавливаем размеры звезды и прорисовки (зависят от объёма):

QRectF Star::boundingRect() const

{

return QRectF(-40, -40, volume+40, volume+40);

}

QPainterPath Star::shape() const

{

QPainterPath path;

path.addEllipse(-20, -20, volume, volume);

return path;

}
В методе paint происходит непосредственно рисование:

Делаем внутреннюю область темнее при выделении.

QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color;

if (option->state & QStyle::State_MouseOver) fillColor = fillColor.light(125);

QPen oldPen = painter->pen();

QPen pen = oldPen;

int width = 0;

if (option->state & QStyle::State_Selected)

width += 2;
Рисуем звезду в виде окружности:

QBrush b = painter->brush();

painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100)));

painter->drawEllipse(-20, -20, volume, volume);

painter->setBrush(b);
Если позиция ползунка увеличения больше 250, то показываем текст названия звезды:

if (option->levelOfDetail >= 1) {

QFont font("Times", 10);

font.setStyleStrategy(QFont::ForceOutline);

painter->setFont(font);

painter->save();

painter->setPen(QColor(Qt::black));

painter->scale(0.35, 0.35);

painter->drawText(-45, -25, name);

painter->restore();

}
При двойном клике мышью выводим информационное сообщение:

void Star::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event){

QVariant yc = y;

QMessageBox::information(0, "Star's Name", starData);

}


1.3.5. Constellation

Данный класс, аналогично классу звезда, наследуется от QGraphicsItem. Их реализации схожи. Приведём заголовочный файл:

class Constellation : public QGraphicsItem

{

public:

Constellation(QString name, const QColor &color);
QRectF boundingRect() const;

QPainterPath shape() const;

void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget);
protected:

void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
private:

int x, y;

QColor color;

QString name;

};
Характеризуется координатами, цветом и именем. Координаты зависят от входящих в созвездие звёзд, поэтому перерасчёт не требуется. Методом setData устанавливается название и тип.

Для затемнения фона надписи с помощью метода setOpacity сделаем двойной градиент.

painter->save();

painter->setBrush(QBrush(QColor(Qt::black)));

painter->setPen(QPen(QColor(Qt::black)));

painter->setOpacity(0.3);

painter->drawEllipse(-160,135,580,-400);

painter->restore();

painter->save();

painter->setBrush(QBrush(QColor(Qt::black)));

painter->setPen(QPen(QColor(Qt::black)));

painter->setOpacity(0.75);

painter->drawEllipse(-70,50,410,-220);

painter->restore();

1.3.6. Ruler

Данный класс наследуется от QGraphicsItem. Характеризуется переменной value – цифра на делении линейки. Реализация стандартна для класса такого типа. Отметим лишь, что цифры линейки при изменении кратности увеличения не должны менять размер, поэтому будем, обратно пропорционально менять размер цифры, если кратность увеличения меньше единицы и прямо пропорционально, если кратность больше единицы.

painter->scale(1/option->levelOfDetail,1/option->levelOfDetail);

painter->translate(option->levelOfDetail*10,0);

if (option->levelOfDetail>1)

painter->translate(option->levelOfDetail*10,option->levelOfDetail*10);
1.3.7. InputDialog

Для создания диалогового окна выбора текущего положения, воспользуемся классом QDialog.

Заголовочный файл:

class InputDialog : public QDialog {

Q_OBJECT

private:

QSpinBox* hourSpinBox;

QSpinBox* gradSpinBox;

public:

InputDialog(QWidget* pwgt = 0);

QString hour() const;

QString grad () const;

};

Содержит 2 поля типа QSpinBox и публичные строки выдачи hour и grad.

В реализации создаются 2 поля и указывается их минимальные и максимальные значения:

hourSpinBox = new QSpinBox;

gradSpinBox = new QSpinBox;

hourSpinBox->setRange(0, 23);

gradSpinBox->setRange(-90, 90);

Создаём кнопки подтверждения и отмены, для этого предусмотрены встроенные слоты accept и reject.

Далее выдаём введённые значения при нажатии на кнопку «OK».

QString InputDialog::hour() const

{

return hourSpinBox->text();

}

QString InputDialog::grad() const

{

return gradSpinBox->text() ;

}

1   2   3   4   5   6

Похожие:

Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат Флягина Т. А. Проблемы разработки многооконных интерфейсов,...
Флягина Т. А. Проблемы разработки многооконных интерфейсов, квалификационная работа на степень бакалавра наук
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат: Коваленко А. Е. Разработка системы научной визуализации....
Коваленко А. Е. Разработка системы научной визуализации. Квалификационная работа на степень магистра наук по направлению «Математика....
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРешение проблем, при реализации метафоры манипуляции «Волшебный скальпель»
Попова А. В. Использование визуальных манипуляционных метафор при разработке информационной системы, квалификационная работа на степень...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат: Шайдуров А. Г. Исследование и разработка некоторых графических...
Шайдуров А. Г. Исследование и разработка некоторых графических алгоритмов. Квалификационная работа на степень магистра наук по направлению...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат Пояснительная записка: с., рис., табл., приложений, источников....
Пояснительная записка: с., рис., табл., приложений, источников
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconЛитература
Уросов А. П. Разработка методик визуализации для представления работы параллельных программ, квалификационная работа на степень бакалавра...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат в данном дипломном проекте всего: стр. 123, рис. 29, табл....
Тяговая подстанция, распределительное устройство, трансформатор, ток короткого замыкания, преобразовательный агрегат, стуктурная...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат На стр., 12 частей, библ. 17 назв. Авторское право и смежные...
«Разработка типовых лицензий на приобретаемые в рамках государственных контрактов фцп “Электронная Россия” (2002-2010 годы) права...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconТребования к письменным работам Объем текста работы
Объем текста работы определяемом видом работы: выпускная квалификационная работа – 50-75 стр.; курсовая работа – 25-30 стр.; реферат...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат (18 стр., рис., 3 табл.)
Объектом исследования являлись системы централизованного и локального водоотведения мо ракитинское
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconПравительство Российской Федерации Федеральное государственное автономное...
Выпускная квалификационная работа. 81 с., 10 рис., 5 приложений, 26 источников литературы
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат Алаева В. С. Расчет и моделирование системы электросвязи....
Целью курсовой работы является расчёт и моделирование системы электросвязи в системе схемотехнического моделирования micro-cap 9
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат Объем: 119 стр., 16 рис., 7 табл., 7 использованных источников
...
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconПроекта: Разработка Web-приложений
Разработка web-приложений, бизнес процесс разработки web-приложения, cms drupal, создание сайта кафедры
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат Дипломный проект 117 с., 15 рис., 19 табл., 39 источников
Цель работы – детальная разработка пункта технического обслуживания электровозов с комплексной механизацией
Реферат Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра наук: стр. 56, рис. 6, табл. 1, схем 3, библ. 15 назв., приложений 1 iconРеферат 3 3 Содержание 4 4 Определения 5 5 Введение 6 6 Основная...
В ходе работы, в течении данного семестра мы изучали технологии веб-программирования и верстки позволяющие делать стабильные, удобные...


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск