Реклама
  • EVILEG
  • Ответ
  • 12 июля 2017 г. 2:30

QML Canvas + Line. Bug?

В QML у Context2D в Canvas есть свойство miterLimit, выставьте его на 1 или даже на 0.1 тогда будет выглядеть так, как вы хотите.

    Canvas {
          id: myCanvas
          anchors.fill: parent


          onPaint: {
              var ctx = getContext('2d')

              ctx.lineWidth = 3
              ctx.miterLimit = 0.1  // Вот эта настройка
              ctx.strokeStyle = "#37474f"
              ctx.beginPath()
              ctx.moveTo(130.5, 38);
              ctx.lineTo(130.5, 150);
              ctx.lineTo(126, 85);
              ctx.stroke()
          }
      }
  • modos189
  • Вопрос
  • 12 июля 2017 г. 0:05

QML Canvas + Line. Bug?

Пришлось порисовать, использовал для этого канвас.  И оказалось, что он как-то глючно работает.
Во-первых, появляются артефакты при большом количестве отрисовываемых элементов (алгоритм был очень неоптимизированный, исправил, потому пример дать не могу),
Во-вторых, такой артефакт стабильно держится: если для отрисовываемой линии lineWidth выставлен больше одного, а следующая линия расположена под небольшим углом к прошлой линии, то появляется продолжение линии. Вот небольшой код, на котором у меня это повторяется. Qt 5.9.0 GCC 64bit, Linux Debian

    Canvas {
        id: myCanvas
        anchors.fill: parent

        onPaint: {
            var ctx = getContext('2d')

            ctx.lineWidth = 3
            ctx.strokeStyle = "#37474f"
            ctx.beginPath()
            ctx.moveTo(130.5, 38);
            ctx.lineTo(130.5, 150);
            ctx.lineTo(126, 85);
            ctx.stroke()
        }
    }

На скриншоте видно разницу с HTML версией canvas, как это должно выглядеть.
  • EVILEG
  • Статья
  • 5 июля 2017 г. 17:14

QML - Урок 030. Регистрация QML Типа в качестве Синглетон объекта

QML, singleton

Помимо C++ классов в QML в качестве Синглетона можно использовать и QML типы, которые представляют собой отдельные файлы QML.

Для этого также используется qmlRegisterSingletonType , но чтобы этот тип работал в качестве Singleton объекта, необходимо прописать в самом QML файле pragma Singleton.

Давайте сделаем небольшое приложение, которое будет выводить также несколько сообщения, при этом сообщения будут забираться через метод Singleton QML Типа.

  • EVILEG
  • Статья
  • 5 июля 2017 г. 16:05

QML - Урок 029. Регистрация Синглетон объекта для использования "Статических" методов в QML

qml, singleton, static

Понятие статических методов, которые используются в QML несколько отличается от классического в C++, когда в классе создаются статические методы, которые можно использовать обращаясь к имени класса, а не к какому-то конкретному объекту. В случае с QML дела обстоят несколько иначе. Для того, чтобы использовать такие методы в QML, которые присутствуют в C++ классе, необходимо зарегистрировать Синглетон объект, который будет предоставлять требуемые методы, причём эти методы уже не должны быть статическими сами по себе. Они должны как минимум быть помечены макросом Q_INVOKABLE , чтобы их можно было использовать в QML.

Для регистрации Синглетона необходимо использовать функцию qmlRegisterSingletonType , в которую помимо стандартных параметров, которые передаются в qmlRegisterType , необходимо также передать статическую функцию singletonProvider , которую также предстоит написать самим.

  • EVILEG
  • Статья
  • 1 июля 2017 г. 16:03

QML - Урок 028. Регистрация пользовательских enum в QML

QML, enum, qmlRegisterType

Для того, чтобы использовать в QML перечисления enum, прописанные в C++, необходимо создать класс, наследованный от QObject, и зарегистрировать его в качестве QML Type перед запуском QML движка  в приложении.

Для изучения создайте проект с использованием QtQuick.

Минимальный вариант такого класса с перечислениям будет следующим:

#ifndef INFO_H
#define INFO_H

#include <QObject>

class Info : public QObject
{
    Q_OBJECT
public:
    enum State {
        Information,
        Debug,
        Warning,
        Error
    };
    Q_ENUM(State)
};

#endif // INFO_H
  • EVILEG
  • Ответ
  • 1 июля 2017 г. 0:04

от QT к QML

Добрый день.

Угораздило вас спросить, пока я был в переезде в другую страну.

Вы молодец, нормальное решение.

Что касается TableView, то я тоже был огорчён, когда увидел, что TableView отсутствует. Выкрутиться можно несколько иначе. Сделать Delegate для ListView, который будет формировать строку и оформление этой строки. Например вот в статье есть delegate для ListView в QML. Полагаю, что возможность рисования своего делегата для строки в ListView и сподвигло разработчиков не заморачиваться с отдельным TableView . Хотя это и прискорбно.

Делегат подчиняется всем правилам вёрстки в QML, так что это просто дополнительный графический компонент, который нужно сверстать.
  • alex_lip
  • Ответ
  • 29 июня 2017 г. 16:22

от QT к QML

Сам себе напишу ответ. Может быть кому-то пригодится.. Все делается также через контекст.
QT

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
 
    QStringList dataList;
    dataList.append("Item 1");
    dataList.append("Item 2");
    dataList.append("Item 3");
    dataList.append("Item 4");
 
    QQmlApplicationEngine engine;
 
    AppCore appCore;
    QQmlContext *context=engine.rootContext();
    context->setContextProperty("appCore", &appCore);
 
    context->setContextProperty("myModel", QVariant::fromValue(dataList));
 
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
 
    return app.exec();
}


QML

 ListView {
                width: 100; height: 100
 
                model: myModel
                delegate: Rectangle {
                    height: 25
                    width: 100
                    Text { text: modelData }
                }
  • alex_lip
  • Вопрос
  • 28 июня 2017 г. 12:46

от QT к QML

Добрый день.
Большое спасибо вам за ваши уроки.  Можете смело издавать книгу "100 первых уроков для QT/QML".
Теперь вопрос. Я сделал на QT разбор JSON файла (который я получаю с сайта при помощи networkadapter). Получил таблицу. На QT все работает. Теперь хочу эту таблицу показать в слое QML.
Благодаря уроку сигналы и слоты в QML передал в слой QML  одну ячейку из этой таблицы в текстовое поле. Все хорошо.
Но теперь "завис" никак не пойму как мне на основе разобранного JSON файла создать модель и передать ее на слой QML например в ListView. Количество полей мне заранее известно. Урок с примером Передача данных из QSqlQueryModel в Qml TableView для меня оказался слишком сложным. Можете на каком-то более простом примере пояснить?

Реклама
Последние комментарии
  • EVILEG
  • 13 июля 2017 г. 2:12

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Ну например так можете сделать.void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ if (QApplication::mouseButtons() == Qt::RightButton) { this->deleteLa...

  • Mark
  • 13 июля 2017 г. 1:26

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Подскажите пожалуйста как в данном проекте по перетаскиванию организовать удаление объекта со scene методом delete item, допустим при щелчке ПКМ по объекту QGraphicsScene. Мои попытки оказалис...

  • EVILEG
  • 10 июля 2017 г. 21:34

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

А что делали? Повторяете урок или как? Пытались просто скачать проект в конце статьи и запустить?

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

У меня происходит переполнение счетчика count, появляется ошибка malloc(): memory corruption (fast). Не подскажите, как с этим бороться?

  • EVILEG
  • 9 июля 2017 г. 2:07

GameDev на Qt - Урок 3. Уничтожение противников

Поэтому в пятом уроке есть исходники всего проекта )))). Вообще, все эти материалы были не предыдущей версии сайта, которая на WordPress. Во время переноса мог что-то потерять.

Сейчас обсуждают на форуме

Как реализовать отправку e-mail

Возможно что уже и нет необходимости в почтовом клиенте, но в своё время так же столкнулся с данной проблемой в QT. Нашел один интересный проект под названием libqxt, там реализовано дов...

  • BlinCT
  • 18 июля 2017 г. 0:00

тестирование классов в QT

Это был вопрос или утверждение? Не понятно что вы хотели этим сказать. Интересное у вас обращение.

  • Asteri
  • 14 июля 2017 г. 12:23

css

Делюсь, может, пригодится когда-нибудь) QTableView QHeaderView { background-color: #ffffff; } Вот так эта проблема лечится, градиент задать не получается, но хоть...

  • EVILEG
  • 12 июля 2017 г. 19:52

QSqlQuery выполнение sql запросов из файла

Мне думается, что это уже будет дело вкуса и вашего взгляда на проект. Если Вы действительно собираетесь просто скармливать своему софту SQL скрипты, которые должны будут выполняться для...

QML Canvas + Line. Bug?

Вот оно что, значит не баг) Спасибо