© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
12 сентября 2018 г. 15:32
Arrow

Полосы прокрутки в QML

Добрый день!

Есть такой элемент 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 полосы прокрутки, чтобы можно было просматривать все содержимое?

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

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

Меню уровней на QML и C++

Здравствуйте, хочу сделать динамически формируемое меню уровней для игры (то есть меню которое в зависимости от числа уровней имеющихся например в файле 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

Анимация элементов в QML

Добрый день!

Пытаюсь сделать анимацию прямоугольника (служит стилизированой кнопкой) при нажатии на него мышкой.
Все отображается корректно, клик по 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
        }
    }
}
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 (отличается только модель, но вряд ли это важно)

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

Qt C++ vs QML

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

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







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

Как подключить QtCharts в QML?

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

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

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

Отображение FPS в приложении

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

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




13 июня 2018 г. 18:27
dmitry.maslov

Получить последний дочерний элемент по клику QML

Есть форма. Состоящую из элементов. Мы перекрываем все MouseArea и при клике на кнопку, нам нужно получить объект этой кнопки, пропустив все перед ним слои. Как это сделать? Пример кода с рекурсией, но он не всегда срабатывает. cntnts - id Главного ITEM

onClicked: {
            var baz = cntnts.childAt(mouseX, mouseY);
            var itm =cntnts.childAt(mouseX, mouseY);
            while(true)
            {
                var X1 = mouseX
                var Y1 = mouseY
                console.log(itm.objectName);
                console.log(itm.children.length);
                console.log(itm.children[0]);
                console.log(baz.children[0].objectName);
                console.log(itm.childAt);
                if(itm.children.length>=0)
                {
                   baz = itm;
                   itm = itm.childAt(mouseX, mouseY);
                }
                else
                {
                    break;
                }
                if (itm.objectName === "BTNL")
                {
                    break;
                }

            }
            console.log(itm);
}
1 июня 2018 г. 9:20
Terabaytus

Как из TextField получить текст в слое С++?

Добрый день, подскажите пожалуйста. В слое QML есть TextField  как получить из него данные в С++ при использование данного кода приложение сразу закрывается и пишет в лог

Программа неожиданно завершилась.
Процесс был завершён принудительно.

 import QtQuick 2.9
   import QtQuick.Window 2.2
   import QtQuick 2.6
   import QtQuick.Controls 1.4
   import QtQuick.Controls 2.1


 Window {
id: window
visible: true
width: 300
height: 310
maximumHeight: height
maximumWidth: width
minimumHeight: height
minimumWidth: width
title: qsTr("")

Connections {

    target: backend  

    onSendToQml: {

      console.log("QML " + count); 
    }

} 

  TextField {
                id: textField
                objectName: "sp"
                x: 9
                y: 36
            } 

  Switch {
                id: control
                x: 0
                y: 0
                width: 300
                height: 50
                text: qsTr("")
                checked: false
                onClicked: {

                    backend.setBackend(control);

                }
                contentItem: Text {
                    rightPadding: control.indicator.width + control.spacing
                    text: control.text
                    font: control.font
                    opacity: enabled ? 1.0 : 0.3
                    color: control.down ? "#17a81a" : "#21be2b"
                    elide: Text.ElideRight
                    verticalAlignment: Text.AlignVCenter
                }

                indicator: Rectangle {
                    implicitWidth: 48
                    implicitHeight: 26
                    x: control.width - width - control.rightPadding
                    y: parent.height / 2 - height / 2
                    radius: 13
                    color: control.checked ? "#17a81a" : "transparent"
                    border.color: control.checked ? "#17a81a" : "#cccccc"

                    Rectangle {
                        x: control.checked ? parent.width - width : 0
                        width: 26
                        height: 26
                        radius: 13
                        color: control.down ? "#cccccc" : "#ffffff"
                        border.color: control.checked ? (control.down ? "#17a81a" : "#21be2b") : "#999999"
                    }
                }

                background: Rectangle {
                    implicitWidth: 100
                    implicitHeight: 40
                    visible: control.down /*|| control.highlighted*/
                    color: control.down ? "#bdbebf" : "#eeeeee"
                }
            }

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "backend.h"

 int main(int argc, char *argv[])
 {
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

   QGuiApplication app(argc, argv);

   QQmlApplicationEngine engine;

   BackEnd backend;  

  QQmlContext *context = engine.rootContext();

   context->setContextProperty("backend", &backend); 
   engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    return -1;

   return app.exec();
 }

#ifndef BACKEND_H
#define BACKEND_H

#include <QObject>
#include <QString>

 class BackEnd : public QObject
  {
  Q_OBJECT

public:
explicit BackEnd(QObject *parent = 0);


signals: 

void sendToQml(int count);

private slots: 
void setBackend(bool control);

public: 

};
 #endif // BACKEND_H

#include "backend.h"
#include <iostream>

   BackEnd::BackEnd(QObject *parent) : QObject(parent)
  {
  }


   void BackEnd::setBackend(bool control) 
 {


   //Найдем строки ввода
    QObject* field1 = this->parent()->findChild<QObject*>("sp");

  //Считаем информацию со строк ввода через свойство text
    QString str1=(field1->property("text")).toString();

 //  std::cout << str1 << std::endl ;

  }



31 мая 2018 г. 13:10
AlexTeos

Использование QSqlQueryModel и базы данных в разных потоках.

QObject::connect: Cannot queue arguments of type 'QQmlChangeSet'Добрый день!


Во первых хотел вас поблагодарить за всю вашу работу связанную с этим сайтом! Вы проделали огромную работу благодаря которой, изучение QT становится простым и быстрым для русскоязычных пользователей.

Теперь о проблеме с которой я столкнулся. Я реализую приложение где основная логика заложена в "ядро", а GUI в двух версиях на QML и на виджетах подключается к ядру с помощью представителя(MVP). Ядро переносится представителем в отдельный поток. У ядра есть модуль подключения к базе данных, соответственно с GUI он находится в разных потоках. И проблема с которой я столкнулся - в каком из потоков должны работать модели?

Изначально я создавал модели в потоке GUI, и при одновременном заполнении БД и попытке работать с ней из GUI постоянно сыпались ошибки. Перенеся создание моделей в модуль подключения к БД версия на виджетах стала работать стабильно, но версия для QML стала работать не корректно - появлялась ошибка QObject::connect: Cannot queue arguments of type 'QQmlChangeSet'
с которой я не первый кто сталкивается, но ее причины я не понял. Возникает она при вызове метода setQuery,  и гробит элементы ListView.

Для формирования "таблицы" из QSqlQueryModel - использую код отсюда - https://wiki.qt.io/How_to_Use_a_QSqlQueryModel_in_QML из раздела "A more generic approach".

Был бы вам очень благодарен, что бы вы возможно не просто подсказали мне решение этой проблемы, но и в целом описали метод использования моделей в многопоточном приложении.

Спасибо!
21 сентября 2018 г. 15:37
irishaa

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

  • Результат 41баллов,
  • Очки рейтинга-8
20 сентября 2018 г. 20:16
ZaRYa

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

  • Результат 46баллов,
  • Очки рейтинга-6
17 сентября 2018 г. 20:45
Иван Поп

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

  • Результат 93баллов,
  • Очки рейтинга8
Последние комментарии
21 сентября 2018 г. 9:24
Евгений Легоцкой

Qt Linux - Урок 001. Автозапуск Qt приложения под Linux

Если я вас правильно понял, то авторестарт сюда дописывается  QString autorunContent. Не могли бы вы не выделять пока слова жирным текстом, в комментариях сломан парсинг тегов, завтра буд...
21 сентября 2018 г. 9:08
avovana

Qt Linux - Урок 001. Автозапуск Qt приложения под Linux

Спасибо за статью! Пример рабочий! Со своим проектом тоже получилось! Наткнулся на эту статью когда решал задачу запуска Qt app с помощью . Когда пробовал с помощью...
20 сентября 2018 г. 13:27
Евгений Легоцкой

Привет Qt для Python

Может быть, я не все новости отслеживаю по Qt. По возможности слежу, но не всегда удаётся.
20 сентября 2018 г. 13:17
OBEH

Привет Qt для Python

По моему. в последней версии Qt анонсировали поддержку Python. Я где-то видел видео. К сожалению. не помню ссылку. Там что-то. типа. проекта "Qt forPython". Все аналогично тому. как для ...
20 сентября 2018 г. 9:58
Евгений Легоцкой

Привет Qt для Python

Qt Creator и Qt Designer по сути не имеют поддержки Python, чтобы код автоматически генерировался и т.д. Нужно устанавливаться дополнительные инструменты. Например сам Python, рекмоендую...
Сейчас обсуждают на форуме
22 сентября 2018 г. 16:21
Евгений Сальников

Проблемы при создании приложения под андроид

Добрый день!Хочу написать приложения для себя на телефон. Но запнулся на этапе создания проекта. в профилях Qt для Qt 5.11.2 for Android ARMv7 и Qt 5.11.2 for Android x86 пишет что: компилятор не...
21 сентября 2018 г. 8:25
Евгений Легоцкой

Прокси-модель, содержащая на 1 столбец больше, чем модель-источник.

Попробуйте ещё PySide 2 - это официально поддерживаемый пакет привязок Python к Qt, возможно, что там не будет таких проблем.
20 сентября 2018 г. 20:06
Евгений Легоцкой

Qt Installer Framework

Добрый день. Зачем собирать Qt Installer Framework-то из исходников? Я ещё понимаю Qt собирают из исходников статически (хотя тоже считаю по большей части бесполезной тратой времени),...
19 сентября 2018 г. 10:19
Евгений Легоцкой

Как в listview подставить модель?

Добрый день. А нельзя ли использовать какой-нибудь глобальный map контейнер, который бы мапил названия моделей на указатели этих моделей?
17 сентября 2018 г. 11:08
Евгений Легоцкой

Проблемы с статической компиляцией Qt с MySQL

Ну если, то да. Тогда просто буду давать ссылку на этот топик, если будут возникать подобные вопросы. Спасибо за ответ.
Присоединяйтесь к нам в социальных сетях