Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
n
Jan. 29, 2019, 6:40 p.m.
npukoluct

Добрый день реализовал перемещение персонажа по сцене (и персонаж и сцена унаследованы от QQuickItem), но возникло 2 вопроса: 1)При отпускании клавиши движения(в одну из сторон) хочу чтобы анимация (состоит из четырех кадров) доигрывалась до конца, сейчас персонаж может замереть в любом положении. Как это реализовать? Сам вижу способ реализации, путем выставления флага в методе keyReleaseEvent о том что клавиша отпущена, а остоновку таймера отвечающего за отрисовку анимации перенисти в метод nextFrameHero(), добавив условие, что если флаг в методе keyReleaseEvent выставлен и число кадров кратно 4. Может есть какой-то иной способ этого достичь, или мой способ вполно приемлем?

2)Сейчас слишком большая задержка между нажатиями клавиш движения в разные стороны, при быстрой смене направления движения, как ее снизить?

GameBoxes_wd1R9Io.rar GameBoxes_wd1R9Io.rar

logicscene.h:

#ifndef LOGICSCENE_H
#define LOGICSCENE_H

#include <QQuickItem>
#include <QSGSimpleTextureNode>
#include <QSGTexture>
#include <QQuickWindow>
#include <QKeyEvent>
#include <QTimer>

//подключаем классы объектов
#include "door.h"
#include "hero.h"
#include "box.h"

class LogicScene : public QQuickItem
{
    Q_OBJECT
public:
    LogicScene();
    //установка объектов
    void buildLevel();
    void clearGameScene();

private slots:
    void nextFrameHero();

protected:
    virtual QSGNode* updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) override;
    virtual void keyPressEvent(QKeyEvent *event);
    virtual void keyReleaseEvent(QKeyEvent *event);
signals:

public slots:

private:
    QString backgroundPuth;
    Door *door;
    Hero *hero;
    Box *box;
    QVector <QVector<QQuickItem*>> gameItem; //стакан элементов

    const int sizeItem = 96;
    bool moveRightHero; //кадр вправо? или влево, для спрайта вида как у меня
    QTimer *timerHero; //для смены кадров
    int countTimerHero = 0; //счетчик когда отключить
    int currentDirHero = 0; //направление

};

#endif // LOGICSCENE_H

logicscene.cpp:

#include "logicscene.h"

LogicScene::LogicScene()
{
    setFlag(QQuickItem::ItemHasContents);
    backgroundPuth = ":/gameboxes/background_2.png";
    buildLevel();

    timerHero = new QTimer(this);
    connect(timerHero, &QTimer::timeout, this, &LogicScene::nextFrameHero);
}

void LogicScene::buildLevel()
{
    clearGameScene();
    door = new Door();
    door->setParentItem(this);


    hero = new Hero(96, 96, sizeItem);
    hero->setParentItem(this);


    box = new Box(192, 96);
    box->setParentItem(this);



}

void LogicScene::clearGameScene()
{
    for (int i = 0; i < 10; i++)
    {
        QVector <QQuickItem*> temp;
        for (int j = 0; j<20; j++)
        {
            temp.push_back(new QQuickItem());
        }
        gameItem.push_back(temp);
    }
}

void LogicScene::nextFrameHero()
{
    //увеличваем счетчик кадров
    countTimerHero++;
    //определяем позицию кадра по оси y
    hero->setCurrentFrame_y(sizeItem*currentDirHero); //!!!Потом возможно передавать лишь направление, так как перс знает размер
    //определяем сторону анимации влево или вправо по спрайту
    int tempFrame_x = hero->getCurrentFrame_x();
    if (tempFrame_x == 0)
    {
        moveRightHero = true;
    }
    if (tempFrame_x == (sizeItem*2))
    {
        moveRightHero = false;
    }
    if (moveRightHero)
    {
        //смещаем вправо на кадр
        hero->setCurrentFrame_x(tempFrame_x+sizeItem);
    }
    else
    {
        //смещаем влево на кадр
        hero->setCurrentFrame_x(tempFrame_x-sizeItem);
    }
    //само смещение на сцене
    if (currentDirHero==0)
    {
        int tempPos_y = hero->getCurrentPos_y();
        hero->setCurrentPos_y(tempPos_y+sizeItem/8);
    }
    else if (currentDirHero==1)
    {
        int tempPos_x = hero->getCurrentPos_x();
        hero->setCurrentPos_x(tempPos_x-sizeItem/8);
    }
    else if (currentDirHero==2)
    {
        int tempPos_x = hero->getCurrentPos_x();
        hero->setCurrentPos_x(tempPos_x+sizeItem/8);
    }
    else
    {
        int tempPos_y = hero->getCurrentPos_y();
        hero->setCurrentPos_y(tempPos_y-sizeItem/8);
    }
    hero->update();

}

QSGNode *LogicScene::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData)
{
        //этот параметр не используем
        Q_UNUSED(updatePaintNodeData)

        QSGSimpleTextureNode *node = static_cast<QSGSimpleTextureNode *>(oldNode);
        //если нода не существует
        if (!node) {
         node = new QSGSimpleTextureNode();
         QImage img(backgroundPuth);
         QSGTexture *texture = window()->createTextureFromImage(img);
         node->setTexture(texture);
        }


        node->setRect(boundingRect());


        return node;

}

void LogicScene::keyPressEvent(QKeyEvent *event)
{
    if ((event->isAutoRepeat()))
        {
            return;
        }
    switch (event->key())
    {
        case Qt::Key_Down:
        {

            if (countTimerHero ==0) //чтоб не было ложных срабатываний при частых нажатиях
            {
                currentDirHero = 0;
                moveRightHero = true;

                timerHero->start(50);
            }

            break;
        }
        case Qt::Key_Up:
        {

            if (countTimerHero ==0) //чтоб не было ложных срабатываний при частых нажатиях
            {
                currentDirHero = 3;
                moveRightHero = true;

                timerHero->start(50);
            }
            break;
        }
        case Qt::Key_Left:
        {
            if (countTimerHero ==0) //чтоб не было ложных срабатываний при частых нажатиях
            {
                currentDirHero = 1;
                moveRightHero = true;

                timerHero->start(50);
            }
            break;
        }
        case Qt::Key_Right:
        {
            if (countTimerHero ==0) //чтоб не было ложных срабатываний при частых нажатиях
            {
                currentDirHero = 2;
                moveRightHero = true;

                timerHero->start(50);
            }
            break;
        }
    }
    QQuickItem::keyPressEvent(event);
}

void LogicScene::keyReleaseEvent(QKeyEvent *event)
{

    if ((event->isAutoRepeat()))
        {
            return;
        }

    switch (event->key())
    {
        case Qt::Key_Down:
        case Qt::Key_Up:
        case Qt::Key_Left:
        case Qt::Key_Right:
        {

            timerHero->stop();
            countTimerHero = 0;
            break;
        }


    }
    QQuickItem::keyReleaseEvent(event);
}

hero.h:

#ifndef HERO_H
#define HERO_H

#include <QQuickItem>
#include <QSGSimpleTextureNode>
#include <QSGTexture>
#include <QQuickWindow>
#include <QTimer>

class Hero : public QQuickItem
{
    Q_OBJECT
public:
    Hero(int pos_x, int pos_y, int sizeItem);
    void animationMove(int direction, int step);

    int getCurrentPos_x() const;
    void setCurrentPos_x(int value);

    int getCurrentPos_y() const;
    void setCurrentPos_y(int value);

    void setCurrentFrame_x(int value);

    void setCurrentFrame_y(int value);

    int getCurrentFrame_x() const;

    int getCurrentFrame_y() const;

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

signals:

public slots:

private:
    QString imgPuth;
    int currentPos_x; //текущая позиция х - на сцене
    int currentPos_y; //текущая позиция у - на сцене

    int currentFrame_x; // текущий кадр по х
    int currentFrame_y; // текущий кадр по у
    int size = 0;



};

#endif // HERO_H

hero.cpp:

#include "hero.h"

Hero::Hero(int pos_x, int pos_y, int sizeItem)
{
    setFlag(QQuickItem::ItemHasContents);
    imgPuth = ":/gameboxes/people2.png";
    currentPos_x = pos_x;
    currentPos_y = pos_y;
    size = sizeItem;
    currentFrame_x = size * 1;
    currentFrame_y = size * 0;

}

QSGNode *Hero::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData)
{
    Q_UNUSED(updatePaintNodeData)

    QSGSimpleTextureNode *node = static_cast<QSGSimpleTextureNode *>(oldNode);
    //если нода не существует
    if (!node) {
     node = new QSGSimpleTextureNode();
     QImage img(imgPuth);
     QSGTexture *texture = window()->createTextureFromImage(img);
     //node->setSourceRect(96,0,96,96); //показывает часть текстуры
     node->setSourceRect(currentFrame_x,currentFrame_y,size,size);
     node->setTexture(texture);

    }
    else
    {
        node->setSourceRect(currentFrame_x,currentFrame_y,size,size);
    }

    //
    //node->setRect(0,96,96,96); // размер области
    node->setRect(currentPos_x,currentPos_y,size,size);
    return node;
}

int Hero::getCurrentFrame_y() const
{
    return currentFrame_y;
}

int Hero::getCurrentFrame_x() const
{
    return currentFrame_x;
}

void Hero::setCurrentFrame_y(int value)
{
    currentFrame_y = value;
}

void Hero::setCurrentFrame_x(int value)
{
    currentFrame_x = value;
}

int Hero::getCurrentPos_y() const
{
    return currentPos_y;
}

void Hero::setCurrentPos_y(int value)
{
    currentPos_y = value;
}

int Hero::getCurrentPos_x() const
{
    return currentPos_x;
}

void Hero::setCurrentPos_x(int value)
{
    currentPos_x = value;
}

Jan. 22, 2019, 7:16 a.m.

Qt

Qt, QML, Visual Studio, Releases

Qt Visual Studio Tools 2.3.1 были выпущены для Visual Studio Marketplace.

Jan. 21, 2019, 11:48 a.m.

Qt

QML, Qt, Quick

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

R
Dec. 19, 2018, 2:10 p.m.
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. Кто что может подсказать?

Oct. 10, 2018, 11:13 a.m.
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?


Sept. 12, 2018, 3:32 p.m.
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
Sept. 3, 2018, 3:55 p.m.
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. (И тут возникает путаница, ведь отображение рисуется уже в созданном мной классе блока уровня или я чего-то не понимаю?) Или может быть все это можно сделать несколько проще?
Aug. 29, 2018, 1:55 p.m.
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
Aug. 14, 2018, 6:17 a.m.
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
Aug. 10, 2018, 7:07 p.m.
npukoluct

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

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







Last comments
March 19, 2019, 12:57 p.m.
AlexanderBardin

Добрый день. А проверить работоспособность локально как-то можно не указывая реальнй сайт (еще в разработке)
March 16, 2019, 1:55 p.m.
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
March 12, 2019, 10:19 a.m.
Jean Stefanovich

Большое спасибо за разъяснения!
March 12, 2019, 10:04 a.m.
Евгений Легоцкой

Hello, In fact, this functionality or is not implemented, or is not documented. I'm not sure. But I think, that it should be implemented in Text QML Type. Because of we can write text in...
March 12, 2019, 9:51 a.m.
Евгений Легоцкой

Да вы правы. На самом деле проще через QSqlQueryModel, сколько не пытался использовать эти дженерики типо QSqlTableModel и QSqlRelationalTableModel, то всегда упирался в какие-то их ограничени...
Now discuss on the forum
March 19, 2019, 1:43 p.m.
AlexanderBardin

Очень интересная тема. У вас случайно нет статьи с полным циклом интреграции нескольких языков?Так сказать с нуля, что нужно, какие пакеты ставить, что куда писать. Тут вроде информации не ма...
March 17, 2019, 10:47 p.m.
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
March 15, 2019, 9:52 p.m.
Чарльз Грин

спасибо, попробую, отпишусь
m
March 15, 2019, 7:41 p.m.
mihamuz

Сори догадался)
n
March 12, 2019, 4:57 p.m.
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
Join us in social networks

For registered users on the site there is a minimum amount of advertising