Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
21 января 2019 г. 11:48

Qt

QML, Qt, Quick

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

R
19 декабря 2018 г. 14:10
Ruslan-maniak

Приветствую. Реализовал интерфейс с использованием QML в винде на ПК. Однако собрав этот же проект на малине (raspbian), я получил дико лагающее приложение. Хотя интерфейс крайне примитивен. Также приложение выдает сообщение "JIT is disabled for QML. Property bindings and animations will be very slow. Visit https://wiki.qt.io/V4 to learn about possible solutions for your platform." В интернетах пишут что надо включить поддержку OpenGL на малине, но есть нюанс: дисплей у меня работает по SPI интерфейсу, а не HDMI. Кто что может подсказать?

10 октября 2018 г. 11:13
Arrow

Добрый день!

В последнее время мне похоже везет на проблемы с Qt в Windows :)

Решил попробовать поработать с компонентом WebView. Привожу код модулей:

Файл pro:

  1. QT += quick webview # добавил webview

Файл main.cpp:

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QtWebView>
  4. int main(int argc, char *argv[])
  5. {
  6. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  7. QGuiApplication app(argc, argv);
  8. QtWebView::initialize(); // Добавил
  9. QQmlApplicationEngine engine;
  10. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  11. if (engine.rootObjects().isEmpty())
  12. return -1;
  13. return app.exec();
  14. }

Файл Page1Form.ui.qml:

  1. import QtQuick 2.11
  2. import QtQuick.Controls 2.4
  3. import QtWebView 1.1
  4. Page {
  5. property alias webView: webView
  6. WebView {
  7. id: webView
  8. url: "https://www.google.com"
  9. anchors.fill: parent
  10. }
  11. }

Файл main.qml:

  1. import QtQuick 2.11
  2. import QtQuick.Controls 2.4
  3. ApplicationWindow {
  4. visible: true
  5. width: 1024
  6. height: 768
  7. title: qsTr("Title")
  8. SwipeView {
  9. id: swipeView
  10. anchors.fill: parent
  11. currentIndex: 0
  12. Page1Form { }
  13. }
  14. }

Под Linux компилируется, запускается и в WebView загружается страничка Google - все работает.

Под Windows компилируется, запускается, а в WebView пусто.

Проверил в MaintenanceTool все что касается Qt 5.11.1 установлено, кроме sourse.

Может под Windows нужно что-то еще добавить?

В выводе приложения есть строчки:

  1. [2688:4752:1010/140405.035:INFO:media_foundation_video_encode_accelerator_win.cc(370)] Windows versions earlier than 8 are not supported.
  2. ....
  3. [2688:4752:1010/140411.979:ERROR:gles2_cmd_decoder.cc(2603)] [GroupMarkerNotSet(crbug.com/242999)!:988D170600000000]GL ERROR :GL_INVALID_ENUM : BackFramebuffer::Create: <- error from previous GL command

Это что значит, что о  WebView можно забыть если стоит не Windows 8 или 10?


12 сентября 2018 г. 15:32
Arrow

Добрый день!

Есть такой элемент MainArea.qml:

import QtQuick 2.0
import QtQuick.Controls 1.4

Item {
    anchors.fill: parent

        Rectangle {
            id: mainRect
            x: 0
            y: 50
            height: parent.height - y
            width: parent.width
            gradient: Gradient {
                GradientStop {
                    position: 0
                    color: "transparent"
                }
                GradientStop {
                    position: 0.2
                    color: Qt.darker("blue", 4.0)
                }
                GradientStop {
                    position: 0.8
                    color: Qt.darker("blue", 4.0)
                }
                GradientStop {
                    position: 1.00
                    color: "transparent"
                }
            }
        }

        Rectangle {
            id: rect
            x: 0
            y: mainRect.x + mainRect.height + 50
            height: 300
            width: parent.width
            gradient: Gradient {
                GradientStop {
                    position: 0
                    color: "transparent"
                }
                GradientStop {
                    position: 0.2
                    color: Qt.darker("blue", 4.0)
                }
                GradientStop {
                    position: 0.8
                    color: Qt.darker("blue", 4.0)
                }
                GradientStop {
                    position: 1.00
                    color: "transparent"
                }
            }
        }
}

Он будет вставляться в главное окно:

Loader {
        id: clientLoader
        anchors.left: header.left
        anchors.top: menu.bottom
        width: header.width
        height: footer.y - y
        source: Qt.resolvedUrl("qrc:/MainArea.qml")
    }


Подскажите как можно организовать в MainArea.qml полосы прокрутки, чтобы можно было просматривать все содержимое?

Какой компонент для этого использовать?

n
3 сентября 2018 г. 15:55
npukoluct

Здравствуйте, хочу сделать динамически формируемое меню уровней для игры (то есть меню которое в зависимости от числа уровней имеющихся например в файле XML выводит нужное количество на экран). И не много не понимаю как такое реализовать в купе с QML.

Создал специальный класс для блока уровня (пока выводит лишь треугольники) *.h:

#ifndef MODULEPARTMENUELEMENT_H
#define MODULEPARTMENUELEMENT_H

#include <QQuickItem>
#include <QSGGeometryNode>
#include <QSGFlatColorMaterial>

class ModulePartMenuElement : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(bool isActive READ isActive WRITE setIsActive NOTIFY isActiveChanged)
    Q_PROPERTY(QColor activeColor READ activeColor WRITE setActiveColor NOTIFY activeColorChanged)
    Q_PROPERTY(QColor nonActiveColor READ nonActiveColor WRITE setNonActiveColor NOTIFY nonActiveColorChanged)
public:
    ModulePartMenuElement(QQuickItem *parent = 0);


    bool isActive() const;
    QColor activeColor() const;
    QColor nonActiveColor() const;

protected:
    virtual QSGNode * updatePaintNode(QSGNode *node, UpdatePaintNodeData *updatePaintNodeData) override;

signals:
    void isActiveChanged(bool isActive);
    void activeColorChanged(QColor activeColor);
    void nonActiveColorChanged(QColor nonActiveColor);

public slots:
    void setIsActive(const bool isActive);
    void setActiveColor(const QColor activeColor);
    void setNonActiveColor(const QColor nonActiveColor);

private:
    //состояние элемента
    bool _isActive;
    //фон если активен
    QColor _activeColor;
    //фон если не активен
    QColor _nonActiveColor;
    
};

#endif // MODULEPARTMENUELEMENT_H

*.cpp:
#include "modulepartmenuelement.h"

ModulePartMenuElement::ModulePartMenuElement(QQuickItem *parent) : QQuickItem(parent)
{
    

    setFlag(QQuickItem::ItemHasContents, true);
}

bool ModulePartMenuElement::isActive() const
{
    return _isActive;
}

QColor ModulePartMenuElement::activeColor() const
{
    return _activeColor;
}

QColor ModulePartMenuElement::nonActiveColor() const
{
    return _nonActiveColor;
}

QSGNode *ModulePartMenuElement::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData)
{
    Q_UNUSED(updatePaintNodeData)
    QSGGeometryNode *node = static_cast<QSGGeometryNode*>(oldNode);
    
    if (!node)
    {
        node = new QSGGeometryNode();
        node->setFlag(QSGNode::OwnsMaterial, true);
        node->setFlag(QSGNode::OwnsGeometry, true);
    }
        const QRectF rect = boundingRect();
        //геометрия
        QSGGeometry *geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 3);

        QSGGeometry::Point2D *points = geometry->vertexDataAsPoint2D();
        points[0].x = rect.left();
        points[0].y = rect.top();
        points[1].x = rect.left() + rect.width() / 2.0;
        points[1].y = rect.bottom();
        points[2].x = rect.right();
        points[2].y = rect.top();

        node->setGeometry(geometry);
        QSGFlatColorMaterial *material = new QSGFlatColorMaterial;
        if (_isActive)
        {
            material->setColor(_activeColor);

        }
        else
        {
            material->setColor(_nonActiveColor);
        }
        node->setMaterial(material);

        return node;

    
}

void ModulePartMenuElement::setIsActive(const bool isActive)
{
    if (_isActive == isActive)
        return;
    _isActive = isActive;
    emit isActiveChanged(isActive);
}

void ModulePartMenuElement::setActiveColor(const QColor activeColor)
{
    if (_activeColor == activeColor)
        return;
    _activeColor = activeColor;
    emit activeColorChanged(activeColor);
}

void ModulePartMenuElement::setNonActiveColor(const QColor nonActiveColor)
{
    if (_nonActiveColor == nonActiveColor)
        return;
    _nonActiveColor = nonActiveColor;
    emit nonActiveColorChanged(nonActiveColor);
}

Как я думаю, начинать надо с создания класса модели, наследуемой от абстрактной модели, в которую передается список блоков уровней (Из которого можно убрать всю взаимосвязь с QML, так как он делался под статическое размещение элементов) и модель устанавливается в стандартный вьювер в QML, но, насколько я понимаю, нужно будет еще и создавать класс делегата для отображения блока уровня в QML. (И тут возникает путаница, ведь отображение рисуется уже в созданном мной классе блока уровня или я чего-то не понимаю?) Или может быть все это можно сделать несколько проще?
29 августа 2018 г. 13:55
Arrow

Добрый день!

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

Вот код файла MenuButton.qml:
import QtQuick 2.10

Item {
    property string itemText: "Text"
    property int fontSize: 18
    property int itemHeight: 40
    property int itemWidth: 100

    height: itemHeight
    width: itemWidth

    Rectangle {
        id: rect
        anchors.fill: parent
        color: "#0b1160"
        gradient: Gradient {
            GradientStop {
                position: 0.47
                color: "#0b1160"
            }
            GradientStop {
                position: 1.00
                color: "#ffffff"
            }
        }
        border.color: "#1313af"
        border.width: 1

        Text {
            anchors.centerIn: rect
            text: itemText
            font.pixelSize: fontSize
            color: "white"
        }

        states: State {
            name: "clicked"
            when: mouseArea.pressed
            PropertyChanges { target: rect; x: 50; y: 50 }
        }

        transitions: Transition {
           NumberAnimation { properties: "x,y"; easing.type: Easing.InOutQuad }
        }

        MouseArea {
            id: mouseArea
            anchors.fill: rect
            onClicked: console.log(itemText)
        }
    }
}

Код main.qml:
import QtQuick 2.10
import QtQuick.Window 2.10

Window {
    id: root
    visible: true
    width: Screen.width-500
    height: Screen.height-300
    title: qsTr("Test")

    Image {
        source: "qrc:/pict/background.jpg"
        anchors.fill: parent
    }

    Row {
        x: 0
        y: 0
        width: root.width
        spacing: 2

        MenuButton {
            id: optimizeBtn
            itemText: qsTr("Меню 1")
            itemWidth: parent.width/5 - parent.spacing
        }

        MenuButton {
            id: quickBtn
            itemText: qsTr("Меню 2")
            itemWidth: parent.width/5 - parent.spacing
        }

        MenuButton {
            id: protectionBtn
            itemText: qsTr("Меню 3")
            itemWidth: parent.width/5 - parent.spacing
        }

        MenuButton {
            id: toollBtn
            itemText: qsTr("Меню 4")
            itemWidth: parent.width/5 - parent.spacing
        }

        MenuButton {
            id: actionsBtn
            itemText: qsTr("Меню 5")
            itemWidth: parent.width/5 - parent.spacing
        }
    }
}
R
14 августа 2018 г. 6:17
Ruslan-maniak

Приветствую. Пытаюсь сделать многостраничный интерфейс. На каждой странице есть либо PathView, либо ListView. Управление происходит в них только с клавиатуры (без мыши или тачпада). Многостраничность реализую с помощью StackView. Но столкнулся со следующей проблемой: когда я выполняю push новой страницы из обработчика нажатия клавиатуры в PathView первой страницы StackView, то выводится новая страница, но фокус остается на PathView первой страницы. И соответственно клавиатура продолжает обрабатываться в PathView первой страницы. Подскажите как правильно переводить фокус в данном случае? И в целом правильный ли я выбрал путь реализации многостраничного интерфейса? Код:

main
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window
{
    visible: true
    width: 480
    height: 320
    title: qsTr("Hello World")

    StackView
    {
        id: stackMenu
        initialItem: "menuMain.qml"
        focus: true

        function setPage(name)
        {
            stackMenu.push(name);
        }
    }
}
menuMain.qml
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Item
{
    PathView
    {
        anchors.fill: parent
        focus: true

        model: ListModel
        {
            ListElement
            {
                color: "lightgreen"
                title: "Печать"
            }
            ListElement
            {
                color: "orange"
                title: "Настройки"
            }
            ListElement
            {
                color: "orchid"
                title: "Инфо"
            }
        }
        delegate: Rectangle
        {
            id: rect
            width: 100; height: 100
            color: model.color
            scale: PathView.scale
            opacity: PathView.opacity
            z: PathView.z
            Text
            {
                anchors.horizontalCenter: parent.horizontalCenter
                text: model.title
            }
        }
        path: Path
        {
            startX: 240; startY: 200
            PathAttribute { name: "z"; value: 10}
            PathAttribute { name: "scale"; value: 1.5 }
            PathAttribute { name: "opacity"; value: 1 }
            PathQuad { x: 240; y: 50; controlX: 0; controlY: 100 }
            PathAttribute { name: "z"; value: 1}
            PathAttribute { name: "scale"; value: 0.3 }
            PathAttribute { name: "opacity"; value: 0.3 }
            PathQuad { x: 240; y: 200; controlX: 480; controlY: 100 }
        }

        Keys.onLeftPressed:
        {
            decrementCurrentIndex();
            console.log(currentIndex)
        }
        Keys.onRightPressed:
        {
            incrementCurrentIndex();
            console.log(currentIndex);
        }
        Keys.onSpacePressed:
        {
            console.log(currentIndex);
            if(currentIndex == 1)
                stackMenu.setPage("menuSettings.qml");
        }
    }
}

Код модуля menuSettings.qml практически идентичен menuMain.qml (отличается только модель, но вряд ли это важно)

n
10 августа 2018 г. 19:07
npukoluct

Добрый день. Имею опыт разработки  различных расчетных приложений на C++/QT. С QML дел не имел. Решил попробовать себя в Gamedev'е, используя QT. Хочу написать игру по типу Бомбомен для Windows и Android. И задумался над реализацией:

1. Стоит ли использовать QML для этого дела или можно обойтись c++ и opengl?
2. Если использовать QML, то я так понимаю на нем делается весь интерфейс (кнопки меню, джойстик управления для андроид, ...), а сама логика пишется на с++(передвижение персонажа, взрывы,...)?  И на сцене эти оба слоя объединяются?
3. Какой проект предпочтительнее? C++ с присобаченным QML или QML c присобаченным С++?







ОК
7 августа 2018 г. 12:03
Олег Корнев

Делаю проект Python + QML, понадобились диаграммы.
Пытаюсь сделать как в примере http://doc.qt.io/Qt-5/qtcharts-qmlmodule.html .
Ловлю ошибку при попытке подключить QtCharts. Такой модуль не найден.
При установке креатора указал устанавливать чарты.

Операционная система Linux Mint.
Находил решения с прописыванием связей в файле .pro  проекта на плюсах, но у меня такого файла нет.

K
22 июля 2018 г. 7:52
Kaptn

Здравствуйте. Как в окне приложения скрыть отоборажение счетчика FPS сторонних программ? Интерфейс на QML. Флаги окна Qt::Window | Qt::FramelessWindowHint .

И сразу задам второй вопрос: После обновления Qt до версии 4.7 при разворачивании окна в полноэкранный режим - showMaximized() - стал поялвяться баг как на этом скрине . Он пропадает как только навести курсор на какую либо активную область, например кнопку.




IO
20 января 2019 г. 18:39
Ivan Otreshko

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
IO
20 января 2019 г. 15:27
Ivan Otreshko

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:51
vitalir12

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

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
21 января 2019 г. 16:28
Михаиллл

Добрый день.Почему работая на С++, нельзя полноценно использовать dll , написанных на C#, java?И почему используя другие языки, можно использовать dll , написанных на C++?
21 января 2019 г. 16:24
Михаиллл

Нашел ссылку на древние типы данных , а тут нынешние их аналоги.Но все равно каое что непоня:что такое : LPCTSTR, CALLBACK (наверно QDialig),IDOK, EDITSTREAM, TCHARКод...
21 января 2019 г. 14:30
Евгений Легоцкой

Порядок создания тем - пункт 4
ПБ
21 января 2019 г. 9:23
Павел Богдевич

Ребята, привет. Это 2 версии одного приложения. Отличаются только способом инициализации таблицы. В одной версии работает сортировка таблицы, когда кликаешь по хедеру колонки, в другой - нет. ...
21 января 2019 г. 7:36
Евгений Легоцкой

Добрый день! Из ваего вопроса понятна первая часть. На сайте есть статья по динамическому созданию виджетов, посмотрите её для начала - Динамическое создание виджетов . ...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы