© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
21 апреля 2018 г. 20:18

QtQt/C++ - Урок 076. Визуализация математических формул на Qt

Formula, QPainter, Qt, QRegularExpression

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

Вопрос состоит в том, чтобы визуализировать формулу, которая написана в виде некоторой строки.

Например, вы печатаете в некотором поле ввода sqrt(5), а в каком-то виджете будет выведено графическое отображение корня квадратного из 5, то есть не результат, а сама формула. Подобный функционал реализован в Latex и LibreOffice.

Выглядеть это будет следующим образом.

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

30 октября 2017 г. 13:46
Kotop

открытие файла и его передача в PaintEvent

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

Появился вопрос. Не могу придумать, как его решить.

Есть некая папка. Мы из этой папки прекрасно можем считать файлы png.
И есть прекрасная функция PaintEvent, которая перерисовывает всё, что в неё не сунь.

#include <QMainWindow>
#include <QPicture>
#include <QImage>
#include <QPainter>
#include <QFileDevice>
#include <QFileDialog>
#include <QWidgets>


MainWindow::MainWindow(QWidget *parent):QWidget(parent)
{
       setPalette(QPaette(QT::white));
       setWindowTitle("Image")
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QString fileName  = QFileDialog::getOpenFileName(this, tr("Open file"), QDir::currentPath());
    QImage img(fileName); 

    QPainter painter(this);
    painter.drawImage(0,0, img.scaled(this->size())); 
}
Вопрос заключается в том, что как сначала считать картинку,  а потом отправить её в paintEvent??? Пробовал подавать в paintEvent дополнительные параметры, но ничего не происходило.

30 августа 2016 г. 11:23
aleksey_devyatkin

Знакомство с QPainter

Доброго времени суток!
Заранее прошу простить мою некомпетентность в программировании.
Изучая урок, столкнулся с проблемой:при попытке нарисовать внутри QTabWidget линию с помощью QPainter, сталкиваюсь с тем, что ничего не отрисовывается, а в лог выскакивает сообщение
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active

Прошу помочь с решением данной задачи.
Самым великолепным будет проект с решением, т.к. мне намного проще разобраться с готовым решением, чем пытаться что-то синтезировать без наставника =)
.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QMainWindow>
#include <QWidget>
#include <QPainter>
 
namespace Ui {
class Widget;
}
 
class Widget : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
protected:
    /* Определяем виртуальный метод родительского класса
     * для отрисовки содержимого виджета
     * */
    void paintEvent(QPaintEvent *event);
 
private slots:
    void on_pushButton_clicked();
 
private:
    Ui::Widget *ui;
};
 
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(ui->tab); // Создаём объект отрисовщика
 
    painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap));
    painter.drawEllipse(100, 50, 150, 150);
}
 
void Widget::on_pushButton_clicked()
{
    repaint();
}

22 сентября 2015 г. 16:36

QtКак написать игру на Qt - Урок 4. Враг - смысл в выживании

GameDev, QGraphicsItem, QGraphicsScene, QPainter, Qt, написать игру

Продолжаем тему того, как написать игру на Qt. После того, как в прошлых статьях была создана Муха, которая поедает яблоки, настало время создать ей врага. А Враг Мухи , как известно, Паук . Создание игровых персонажей, которые будут участвовать в непосредственной жизни Вашего главного героя - это не только отрисовка анимации действий и передвижения, а также логика реакций на воздействия игрока, но и искусственный интеллект, в соответствии с логикой которого будет определятся поведение игрового персонажа. Таким образом, мы добавляем в игру новый смысл, не только съесть как можно больше яблок, но и выжить любой ценой.

Определим поведение Паука в данной версии игры. Что же он должен делать? Да самое обычное из всех действий - охотиться на Муху , просто гоняться за ней по игровому полю.

Также добавим в игру кнопку для запуска игрового процесса, и паузу, и самое главное, что добавим - это Game Over.

Враг мухи в структуре проекта

Как и в случае с Мухой в структуру проекта добавляется дополнительный класс, который будет отвечать за объект, которым является Паук .

  • spider.h - заголовочный файл класса, отвечающего за Паука
  • spider.cpp - файл исходных кодов, отвечающий за Паука
21 сентября 2015 г. 14:44

QtQt/C++ - Урок 020. QPainter - знакомство с рисованием в Qt

paintEvent, QPainter, QPainter example, QPainter пример, Qt QPainter, Qt рисование

Во фреймворке Qt имеется возможность рисовать как на графической сцене , так и прямо на виджетах. Для этого используется класс QPainter. Рисование объектов на виджетах может производится в функции paintEvent(* event) , которая вызывается при отрисовке виджета.

В данном уроке будет производится работа именно с этой функцией. В ней будет создаваться объект класса QPainter, и с его помощью будет рисоваться круг. При этом рисование круга будет зависеть от трех объектов класса QRadioButton. В зависимости от того, какой радиобаттон выбран, будет выбираться и цвет круга, если же ни один радиобаттон не будет выбран, то круг будет рисоваться белого цвета.

Структура проекта для QPainter

Проект содержит следующие файлы:

  • painter.pro - профайл проекта;
  • widget.h - заголовочный файл класса, в котором и производится работа с QPainter;
  • widget.cpp - файл исходных кодов по работе с QPainter;
  • main.cpp - запускающий файл проекта;
  • widget.ui - интерфейс приложения.
20 сентября 2015 г. 16:08

QtКак написать игру на Qt - Урок 3. Взаимодействие с другими объектами

GameDev, QGraphicsItem, QGraphicsScene, QPainter, Qt, написать игру

После того, как в игре присутствует анимированная Муха , которая передвигается под воздействием клавиш клавиатуры, настало время добавить смысл в игру. Добавим цель Мухе , например, она будет поедать яблоки, которые будут подсчитываться. То есть необходимо настроить взаимодействие Мухи с другими объектами, в данном случае с яблоками.

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

Когда Муха натыкается на яблоко, необходимо передавать данную информацию в ядро игры, которое находится в классе widget. Для этого будем при движении Мухи анализировать объекты, которые попадают в поле её зрения, и с которыми необходимо отработать взаимодействие.

    /* Производим проверку на то, наткнулась ли муха на какой-нибудь
     * элемент на графической сцене.
     * Для этого определяем небольшую область перед мухой,
     * в которой будем искать элементы
     * */
    QList<QGraphicsItem *> foundItems = scene()->items(QPolygonF()
                                                           << mapToScene(0, 0)
                                                           << mapToScene(-20, -20)
                                                           << mapToScene(20, -20));
    /* После чего проверяем все элементы.
     * Один из них будет сама Муха - с ней ничего не делаем.
     * А с остальными высылаем сигнал в ядро игры
     * */
    foreach (QGraphicsItem *item, foundItems) {
        if (item == this)
            continue;
        emit signalCheckItem(item);
    }
19 сентября 2015 г. 15:33

QtКак написать игру на Qt - Урок 2. Анимация героя игры (2D)

GameDev, QPainter, Qt, анимация, написать игру

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

В данном уроке корректировка программного кода производилась в главным образом в файлах triangle.h, triangle.cpp и самую малость в файле widget.cpp.

Анимация Мухи по шагам

Опишем  алгоритм, по которому будет производиться отрисовка Мухи:

  1. Инициализируем в конструкторе класса переменную, которая будет отвечать за номер положения ножек. Всего будет три положения ножек мухи.
  2. Инициализируем в конструкторе класса переменную, которая будет считать полезные тики игрового таймера, то те тики, во время которых Муха передвигалась. Это необходимо, чтобы отсеять те тики, в которых не было движения Мухи , иначе Муха будет постоянно перебирать ножками, даже если мы не будем управлять Мухой .
  3. Отрисовываем Муху в методе paint, выбирая, какое из положений ножек мухи будет отрисовываться.
  4. В слоте, который обрабатывает событие отсчета игрового таймера производит накопление и обнуление счетчика полезных тиков игрового таймера и в зависимости от его величины устанавлвиваем положение ножек Мухи , а именно полностью перерисовываем Муху с нужным положением ножек.
17 сентября 2015 г. 14:22

QtQt/C++ - Урок 019. Рисуем треугольник в Qt5. Позиционирование в QGraphicsScene

QGraphicsItem, QPainter, QPolygon, Qt, Qt5, Рисование Qt, Рисование Qt5, треугольник

Рисование интерфейсов, формирование таблиц баз данных, работа с сетью - это всё хорошо, но иногда хочется просто, что-нибудь нарисовать, например треугольник . А потом конечно же оживить этот объект, чтобы им можно было управлять, и в последствии превратить этот проект в маленькую игру. Ну кто не хочет написать собственную игру, даже самую простую?

Давайте тогда сделаем первый шаг в сторону простенькой игры, а именно разберемся с рисованием объектов в Qt, попробовав нарисовать треугольник .

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта "Треугольник"

Опишем структуру проекта, в котором будем рисовать треугольник:

  • Triangle.pro - профайл проекта, создается по умолчанию и в данном проекте не требует корректироваки;
  • main.cpp - файл, с которого стартует приложение, в данном файле вызывается widget, в котором будет располагаться графическая сцена с треугольником;
  • widget.h - заголовочный файл, вызываемого виджета с графической сценой;
  • widget.cpp - файл исходных кодов виджета;
  • triangle.h - заголовочный файл класса Треугольника , который наследован от QGraphicsItem;
  • triangle.cpp - файл исходных кодов класса Треугольник.
22 мая 2018 г. 9:32
nrjjejdjdhhrjf

C++ - Тест 005. Структуры и Классы

  • Результат 75 баллов
  • Очки рейтинга 2
21 мая 2018 г. 8:30
Nasty

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат 10 баллов
  • Очки рейтинга -10
20 мая 2018 г. 12:26
Venic

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

  • Результат 58 баллов
  • Очки рейтинга -2
Последние комментарии
19 мая 2018 г. 12:44
EVILEG

Django - Snippet 001. get_object_or_none

А вы гарантируете, что метод first вернёт нужный объект, если в таблице две похожих записи? Этого никто не гарантирует. Может возникнуть неопределённое поведение приложения, если запись не так...
19 мая 2018 г. 12:34
Pavel

Django - Snippet 001. get_object_or_none

Согласен с тем что ваше решение более очевидно при чтении кода. first() же здесь применяется не совсем по назначению. А с последствиями "моего" решения не согласен. Метод вернёт только один об...
19 мая 2018 г. 12:27
EVILEG

Как я использовал FilterView заместо ListView для упрощения фильтрации

Может быть, а может и нет, все имеют различную речь.. не могу отвечать за всех пользователей ресурса.. поскольку каждый пользователь может дополнить материал ресурса статьями.
19 мая 2018 г. 12:25
EVILEG

Django - Snippet 001. get_object_or_none

В вашем случае происходит подмена сущностей. Вместо того, чтобы взять один конкретный объект, вы забираете queryset а потом берёте из него первый объект. Нехорошо будет, если queryset в каком-...
19 мая 2018 г. 11:11
Pavel

Django - Snippet 001. get_object_or_none

Тоже искал подобную функцию, чтобы не обрабатывать каждый раз исключения. И нашёл на so совет использовать вместо неё метод менеджера first(), который возвращает None при пустом queryset. Т.е ...
Сейчас обсуждают на форуме
22 мая 2018 г. 16:50
vitaliy_antipov

Данные из QChartview в QTableWidget

Здравствуйте! Пишу приложение для парсинга текстового файла и вывода данных на график. Столкнулся с проблемой передачи данных от курсора мыши на графике в ячейку таблицы. mainwindow.h ...
22 мая 2018 г. 16:33
5_voron_5

Визуализация математических формул

Нужна помощь с визуализацией математических формул в qt на версии 5.4 и ниже, за деньги разумеется, кого интересует вот мыло svet_31_m@mail.ru
22 мая 2018 г. 6:57
EVILEG

Выводит мусор

Имено, класс-потомок. Если добавляли кнопки в графическом дизайнере, то нужно вызвать контекстное меню на кнопке в дизайнере, выбрать пункт "преобразовать в" либо "Promote to". Там будет ...
20 мая 2018 г. 2:05
vitaliy_antipov

Удаление серии из графика

Ой, извините, совсем запарился. Туплю: void MainWindow::onDelSeries(int i){ chartview->chart()->findChild<QLineSeries *>("obj" + QString::number(i))->deleteLater();...
18 мая 2018 г. 8:55
mak_trefa

Сборщик мусора и Connections в qml

можешь попробовать в деструкторе модели вызвать throw; и в дебагере посмотреть stacktrace

Рекомендуемые страницы