Реклама

Тег → Qt

  • EVILEG
  • Статья
  • 14 декабря 2017 г. 22:10

Qt/C++ - Урок 074. Генерация псевдослучайных чисел, использование STD библиотеки random

Qt, C++11, Random, qrand, qsrand, QRandomGenerator

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

Qt предоставляет для генерации случайных числе функцию qrand , а также, начиная с Qt 5.10, класс QRandomGenerator.

Давайте разберём, как можно получить случайные значения в Qt, а также насколько они случайные.

qrand

Будем генерировать числа в диапазоне значений от и до. Для этого напишем две функции.

static int randomBetween(int low, int high)
{
    return (qrand() % ((high + 1) - low) + low);
}

static int randomBetween(int low, int high, int seed)
{
    qsrand(seed); // Установка базового числа для отсчёта рандома в qrand
    return (qrand() % ((high + 1) - low) + low);
}

Первая функция просто генерирует случайное значение от наименьшего числа до наибольшего. Тогда как во второй с помощью функции qsrand устанавливается базовое число, которое служит основанием для генератора псевдослучайных числе Qt, от которого и генерируется число. Таким базовым числом может быть системное время в миллисекундах.

  • cordsac
  • Вопрос
  • 5 декабря 2017 г. 21:37

Problem Occurred when open SVG file

Qt, Svg Reader, C++

In my project which can create rectangle and oval shape like this image .I use this code to open ellipses and rectangles.Which open rectangles and oval/ellipse properly. But when I use this types which not open properly.here with I attach sample SVG file.can you give me a solution to solve this problem.


This is part of SVG file.

<g fill="#ffffff" fill-opacity="1" stroke="#00ff00" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,284,160)"
font-family="MS Shell Dlg 2" font-size="7.8" font-weight="400" font-style="normal" 
>
<rect x="-20" y="-10" width="100" height="100"/>
<rect x="-15" y="-5" width="90" height="90"/>
</g>

This is my code (from this article)

        QDomElement rectangle = gNode.firstChildElement("rect");
        if (!rectangle.isNull()){
            VERectangle *rect = new VERectangle();
            auto gElement = gNode.toElement();
            rect->setRect(rectangle.attribute("x").toInt(),
                          rectangle.attribute("y").toInt(),
                          rectangle.attribute("width").toInt(),
                          rectangle.attribute("height").toInt());

            QString fill = gElement.attribute("fill", "#ffffff");
            if(fill.contains("url(#gradient")){
                fill.replace(QString("url(#gradient"), QString(""));
                fill.replace(QString(")"), QString(""));
                QLinearGradient g = gradientList.at(fill.toInt() - 1);
                auto tmpRect = rect->rect();
                g.setStart(tmpRect.left() + tmpRect.width()/2,tmpRect.top());
                g.setFinalStop(tmpRect.left() + tmpRect.width()/2,tmpRect.bottom());
                rect->setBrush(QBrush(g));
            } else {
                QColor fillColor(gElement.attribute("fill", "#ffffff"));
                fillColor.setAlphaF(gElement.attribute("fill-opacity","0").toFloat());
                rect->setBrush(QBrush(fillColor));
            }

            QColor strokeColor(gElement.attribute("stroke", "#000000"));
            strokeColor.setAlphaF(gElement.attribute("stroke-opacity").toFloat());

            QString transString = gElement.attribute("transform");
            transString.replace(QString("matrix("),QString(""));
            transString.replace(QString(")"),QString(""));
            QStringList transList = transString.split(",");

            QTransform trans(rect->transform());

            qreal m11 = trans.m11();    // Horizontal scaling
            qreal m12 = trans.m12();    // Vertical shearing
            qreal m13 = trans.m13();    // Horizontal Projection
            qreal m21 = trans.m21();    // Horizontal shearing
            qreal m22 = trans.m22();    // vertical scaling
            qreal m23 = trans.m23();    // Vertical Projection
            qreal m31 = trans.m31();    // Horizontal Position (DX)
            qreal m32 = trans.m32();    // Vertical Position (DY)
            qreal m33 = trans.m33();    // Addtional Projection Factor

            m11 = transList.at(0).toFloat();
            m12 = transList.at(1).toFloat();
            m21 = transList.at(2).toFloat();
            m22 = transList.at(3).toFloat();
            m31 = transList.at(4).toFloat();
            m32 = transList.at(5).toFloat();

            trans.setMatrix(m11,m12,m13,m21,m22,m23,m31,m32,m33);
            rect->setTransform(trans);
            rect->setPen(QPen(strokeColor,gElement.attribute("stroke-width", "0").toInt()));

            graphicsList.append(rect);
            continue;
        }

 // for_ovel

        QDomElement ovel = gNode.firstChildElement("ellipse");
        if (!ovel.isNull()){
            ovalshape *ellipseItem = new ovalshape();
            auto oElement = gNode.toElement();
            ellipseItem->setRect(ovel.attribute("cx").toFloat() - ovel.attribute("rx").toFloat(),
                                 ovel.attribute("cy").toFloat() - ovel.attribute("rx").toFloat(),
                                 ovel.attribute("rx").toFloat() * 2,
                                 ovel.attribute("ry").toFloat() * 2);

            QString fill = oElement.attribute("fill", "#ffffff");
            if(fill.contains("url(#gradient")){
                fill.replace(QString("url(#gradient"), QString(""));
                fill.replace(QString(")"), QString(""));
                QLinearGradient g = gradientList.at(fill.toInt() - 1);
                auto tmpRect = ellipseItem->rect();
                g.setStart(tmpRect.left() + tmpRect.width()/2,tmpRect.top());
                g.setFinalStop(tmpRect.left() + tmpRect.width()/2,tmpRect.bottom());
                ellipseItem->setBrush(QBrush(g));
            } else {
                QColor fillColor(oElement.attribute("fill", "#ffffff"));
                fillColor.setAlphaF(oElement.attribute("fill-opacity","0").toFloat());
                ellipseItem->setBrush(QBrush(fillColor));
            }

            QColor strokeColor(oElement.attribute("stroke", "#000000"));
            strokeColor.setAlphaF(oElement.attribute("stroke-opacity").toFloat());

            QString transString = oElement.attribute("transform");
            transString.replace(QString("matrix("),QString(""));
            transString.replace(QString(")"),QString(""));
            QStringList transList = transString.split(",");

            QTransform trans(ellipseItem->transform());

            qreal m11 = trans.m11();    // Horizontal scaling
            qreal m12 = trans.m12();    // Vertical shearing
            qreal m13 = trans.m13();    // Horizontal Projection
            qreal m21 = trans.m21();    // Horizontal shearing
            qreal m22 = trans.m22();    // vertical scaling
            qreal m23 = trans.m23();    // Vertical Projection
            qreal m31 = trans.m31();    // Horizontal Position (DX)
            qreal m32 = trans.m32();    // Vertical Position (DY)
            qreal m33 = trans.m33();    // Addtional Projection Factor

            m11 = transList.at(0).toFloat();
            m12 = transList.at(1).toFloat();
            m21 = transList.at(2).toFloat();
            m22 = transList.at(3).toFloat();
            m31 = transList.at(4).toFloat();
            m32 = transList.at(5).toFloat();

            trans.setMatrix(m11,m12,m13,m21,m22,m23,m31,m32,m33);
            ellipseItem->setTransform(trans);
            ellipseItem->setPen(QPen(strokeColor,oElement.attribute("stroke-width", "0").toInt()));

            graphicsList.append(ellipseItem);
            continue;
        }


  • EVILEG
  • Статья
  • 1 декабря 2017 г. 15:43

Выпуск Qt 3D Studio 1.0

Qt, 3D, Studio, Releases

Разработчики Qt анонсировали выпуск Qt 3D Studio 1.0 , которая предоставляет трёхмерную систему разработки пользовательского интерфейса, которая подходит как для разработчиков программного обеспечения, так и для графических дизайнеров.

Qt 3D Studio Editor

Qt 3D Studio - это инструмент для создания интерактивных 3D-презентаций и приложений. Редактор представляет собой кросс-платформенное приложение Qt, которое можно использовать в Windows, Mac и Linux. Вы можете импортировать дизайнерские активы из популярных инструментов разработки, таких как Photoshop, Autodesk Maya и The Foundry MODO.

Qt 3D Studio Editor & Viewer с функцией удаленного подключения

  • Миша
  • Вопрос
  • 29 ноября 2017 г. 10:07

Сигнал от кнопки

Qt, сигналы, слоты

Здравствуйте.

Добавил кнопку  PushButton1 на интерфейс.
Нажал перейти к слоту->clicked()
Создал в хедере
private slots:
    void on_PushButton1_clicked();
В срр:
void MainWindow::on_PushButton1_clicked()
{
    makePlot();
}
Скажите пожалуйста как в конструкторе класса прописать connect(), чтобы при нажатии кнопки PushButton1 вызывался слот on_PushButton1_clicked() ?
  • MinusNull
  • Статья
  • 28 ноября 2017 г. 12:59

Написание пользовательского Qt 3D аспекта - часть 1

Qt 3D, OpenGL, C++, Qt

Введение

Qt 3D имеет гибкую и расширяемую архитектуру, которая позволяет нам легко добавлять в нее свои новые функциональные возможности, не нарушая при этом существующие свойства. Функциональность Qt 3D разделена на так называемые аспекты, каждый из которых инкапсулирует конкретную предметную область, такую как рендеринг (Render Aspect), ввод (Input Aspect) или анимация (Animation Aspect).

В этой короткой серии статей вы познакомитесь с процессом добавления нового аспекта, который предоставляет типы компонентов и поведение для новой области, не охваченной Qt 3D из коробки. В этом примере мы решили реализовать аспект, который позволяет рассчитывать текущую среднюю частоту кадров. Конечно, это можно было бы добавить в средство визуализации, но это достаточно просто, чтобы быть хорошим примером для наших сегодняшних целей. Полный исходный код примера доступен для загрузки .

  • EVILEG
  • Статья
  • 27 ноября 2017 г. 7:42

QML - Урок 034. Передача структур данных из C++ слоя приложения в QML слой

QML, Qt, Meta, Q_INVOKABLE

Один из несомненных плюсов QML в Qt состоит в том, что он позволяет достаточно резко отделять backend-логику от интерфейса приложения. То есть весь backend мы пишем на C++, а в QML лишь отображаем необходимый результат.

При этом мы также можем и внутреннюю логику написать чисто на QML, минимизировав наличие C++ кода, или наоборот прописать дизайн некоторых элементов в C++, воспользовавшись возможностями OpenGL . Несмотря на разграничение QML и C++ частей кода на backend и frontend приложения, мы не имеем каких-либо больших ограничений.

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

struct Structure 
{
    int m_number;
    QString m_message;
};

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

void sendToQml(int number, QString message);

Этот сигнал будет располагаться в вашем классе, который будет отправлять в QML определённую информацию с номерами, сообщениями и т.д. Минус подобного подхода очевиден, поскольку таких полей может быть очень много и будет глупо делать сигнал с парой десятков аргументов. Подобный подход будет полезен для пересылки небольшой информации, но никак не для структур данных.

  • MinusNull
  • Статья
  • 24 ноября 2017 г. 11:08

Qt 5.10 привносит новую Qt Virtual Keyboard 2.3

Qt, Qt 5.10, Virtual Keyboard

Виртуальная клавиатура Qt предоставляет вам интерфейс ввода и ссылку на клавиатуру для Qt 5 на Linux Desktop / X11, Windows Desktop и Boot2Qt - встраиваемые целевые платформы. В дополнение к виртуальной клавиатуре, модуль также предлагает универсальное распознавание рукописного ввода с поддержкой нескольких языков.

Вы можете выбрать одну из настраиваемых раскладок и стилей клавиатуры с динамическим переключением, с поддержкой разных наборов символов (латынь, упрощенный / традиционный китайский, хинди, японский, арабский, корейский и др.), с поддержкой постоянно растущего числа языков, с возможностью легко расширить поддержку языка, сохраняя межплатформенную функциональность.

Некоторые интересные функции с предыдущих релизов:

  • Ввод слева направо и справа налево.
  • Интеллектуальный ввод текста с выбором слова.
  • Предварительный просмотр символа и альтернативный вид символа.
  • Автоматическая установка заглавных букв и вставка пробелов.
  • Масштабируемость к различным разрешениям.
  • Поддержка аппаратного ключа для двухсторонней и 5-позиционной навигации.
  • Звуковая обратная связь.
  • Поддержка рукописного ввода с жестами для полноэкранного ввода.
  • EVILEG
  • Статья
  • 22 ноября 2017 г. 19:01

Выпуск Qt 5.9.3

Dev Loop, Qt, Releases

Разработчики Qt сообщили в своём блоге о выпуске Qt 5.9.3, который является патчем и не привносит ничего нового в плане функционала. Однако внимание в нём было сфокусировано на исправлении багов и улучшении производительности.

  • Mark
  • Вопрос
  • 19 ноября 2017 г. 16:14

QGraphicsItem

Qt, QGraphicItem

Доброго времени суток!

Хотел бы разобраться со вставкой текста на сцену
По структуре урока реализовал это простой вставкой строки

painter->drawText(-30,-30,ok)
Текст добавляется нормально

Проблема в следующем:  при добавлении еще одного итема с другим текстом текст предыдущего итема, уже существующего на сцене заменяется тестом только что добавленного итема. Как сделать чтобы у каждого итема был свой текст?
Заранее спасибо.
  • Миша
  • Вопрос
  • 16 ноября 2017 г. 11:26

Неоднозначность получения сигнала при добавлении класса.

Qt, connections

Здравствуйте.

Добавил в класс наследование от QThread:
class MainWindow : public QMainWindow, public QThread
И сигнала стали неоднозначно определяться:
    connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), volumeAxisRect->axis(QCPAxis::atBottom), SLOT(setRange(QCPRange)));//перетаскивается вместе объем и график
    connect(volumeAxisRect->axis(QCPAxis::atBottom), SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis, SLOT(setRange(QCPRange)));//перетаскивается вместе объем и график
При этом этот сигнал по прежнему хорошо определяется:
QObject::connect(ui->customPlot->xAxis,static_cast<void(QCPAxis::*)(const QCPRange&)> (&QCPAxis::rangeChanged), [=]()
Скажите пожалуйста, как правильно определить первые 2 сигнала?
Реклама
  • JaJay
  • 17 декабря 2017 г. 5:16

C++ - Тест 002. Константы

  • Результат 58 баллов
  • Очки рейтинга -2
  • JaJay
  • 17 декабря 2017 г. 4:55

C++ - Тест 001. Первая программа и типы данных

  • Результат 93 баллов
  • Очки рейтинга 8
  • JaJay
  • 17 декабря 2017 г. 4:48

C++ - Тест 001. Первая программа и типы данных

  • Результат 66 баллов
  • Очки рейтинга -1
Последние комментарии
  • EVILEG
  • 7 декабря 2017 г. 9:47

Django - Урок 011. Добавление комментариев на сайт с Django

Визуальный пример чего? комментариев? При ответе на конкретный комментарий рядом с ником отвечающего будет стрелочка и указание ник другого пользователя. Который будет ссылкой на коммента...

  • Bernar
  • 7 декабря 2017 г. 9:24

Django - Урок 011. Добавление комментариев на сайт с Django

есть визуальный пример ?

  • EVILEG
  • 6 декабря 2017 г. 11:30

Django - Урок 011. Добавление комментариев на сайт с Django

Да, так будет даже лучше, я на сайте уже обновил до такого вида код Вот это уже не нужно if request.method == 'POST': Поскольку Вы и так используете метод post, то есть эта про...

  • Bernar
  • 6 декабря 2017 г. 11:19

Django - Урок 011. Добавление комментариев на сайт с Django

сделал немного по другому class EArticleView(View): template_name = 'knowledge/article.html' comment_form = CommentForm def get(self, request, *args, **kwargs): ...

Сейчас обсуждают на форуме
  • EVILEG
  • 16 декабря 2017 г. 17:23

Пауза в многопоточности

QFuture, который возвращается QtConcurrent::map имеет методы pause() и resume() и теоретически должен поддерживать этот функционал. Но для Qt...

  • Миша
  • 15 декабря 2017 г. 11:26

Как найти в QVector макс и мин

Спасибо

  • Galant
  • 14 декабря 2017 г. 19:58

LPT

Понял! Спасибо!

  • EVILEG
  • 14 декабря 2017 г. 13:38

QCustomPlot можно ли построить прерывистую линию на одном графике?

Во-первых: В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL DEFINES += QCUSTOMPLOT_USE_OPENGL И во вторых:...

  • EVILEG
  • 13 декабря 2017 г. 8:05

В многопоточности выполнять действие только в одном из потоков

Статическиe методs QThread::currentThread(); и QThread::currentThreadId() могут возвращать указатель на поток и его handle id соответственно. Можете попробовать через как...