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

Всем привет. Столкнулся с такой проблемой, на стороне С++ я создаю динамически обьект, его получаю на стороне QML и нужно его добавить в StackView. И как это сделать не могу придумать. Ниже кидаю крестовую часть и QML

TimerContainer::TimerContainer(QObject *parent)
        : QObject(parent)
{
    vec_ = new vector<CircleTimer*>();
    createTimer();
}

CircleTimer *TimerContainer::getTimer(int index)
{
    return vec_->at(index);
}

void TimerContainer::delTimer(int index)
{
    vec_->erase(vec_->begin() + index);
    emit sizeChanged(vec_->size());
}

void TimerContainer::createTimer()
{
    auto timer = new CircleTimer();
    vec_->push_back(timer);
    emit sizeChanged(vec_->size());
    emit addNewTimer(timer);
}

void TimerContainer::createTimers(int number)
{
    if (number != 0)
    {
        while (number != 0)
        {
            createTimer();
            --number;
        }
    }
}

int TimerContainer::size()
{
    return vec_->size();
}

QML

StackView
{
    id: timers

    property var currentTimer: QtObject
    property int currentIndex: -1
    property int targetId: 0

    function selectTimer(idx)
    {
        for (var i = 0; i < timerContainer.size; ++i)
        {
            //timerContainer.getTimer(idx).visible = (i === idx);
            //console.log("idx: " + i + " - " + timerContainer.getTimer(idx).visible)
        }
        currentTimer = timerContainer.getTimer(idx);
        currentIndex = idx;
    }

    //function addTimer(timer) {
    //    timer.parent = circletimercontent1;
    //    timer.anchors.fill = circletimercontent1;
    //}

    Component.onCompleted: {
        for (var i = 0; i < timerContainer.size; ++i)
        {
            timers.push(timerContainer.getTimer(i));
        }

        timers.selectTimer(0);
        timerContainer.addNewTimer.connect(timers.addTimer);

    }

    Connections
    {
        target: currentTimer
    }
}

Наткнулся где то на форумах на var newComponent = Qt.createComponent(arg) var newObj = newComponent.createObject(arg) но не уверен может ли это мне помочь.

Буду признателен если тот кто с чем то подобным сталкивался поможет разобратся в этом.

x
25 декабря 2018 г. 16:07
xintrea

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

    StackView {
        id: stackView

        ...

        // Страница с виджетом выбора файла
        Component {
            id: fileSelectDialogComponent

            FileSelect {
                id: fileSelectDialog
                anchors.fill: parent
                enabled: Stack.status === Stack.Active
            }
        }

Выбор файла вызывается так:

// Вызывается диалог выбора файла
qmlGlobalParameters.fileSelectDialogStartDirectory="тут_имя_директории";
qmlGlobalParameters.fileSelectDialogStartFileName="тут_имя_файла";
qmlGlobalParameters.fileSelectDialogResult="";
stackView.push( fileSelectDialogComponent );

Страница выбора файла сама себя закрывает через вызов pop() для stackView при нажатии кнопки Ok или Cancel.

Теперь сами проблемы:

Так как тип Component не позволяет создавать себе свойства, а позволяет только задавать идентификатор id , то я не могу «вытащить» fileSelectDialog как свойство property alias для fileSelectDialogComponent . Поэтому мне приходится передавать параметры в объект fileSelectDialog не напрямую (потому что я достучаться до него не могу), а через глобальный объект qmlGlobalParameters , о котором «знает» и вызывающий код, и сам тип fileSelectDialog . И это мне очень не нравится. Я сделал вот так «чтоб работало», но хочу переделать так, чтобы по нормальному передавать данные в объект, а так же чтобы иметь возможность работать с сигналами этого объекта.

Но пока этого не сделано, мне нужно научиться ловить момент «выталкивания» компонента fileSelectDialogComponent из стека, чтобы обработать сделанный в этом компоненте выбор файла. В StackView нет сигналов, которые бы вызывались при действии pop() . Привязаться к сигналам fileSelectDialog я не могу, потому что он сидит внутри fileSelectDialogComponent , и потому достучаться до него невозможно. У самого типа Component объекта fileSelectDialogComponent тоже нет сигналов, оповещающих о том что он выталкивается из стека. В общем, везде какие-то странные ограничения, из-за которых я не могу поймать момент завершения работы страницы выбора файла.

Вопрос: как можно отловить этот момент в существующей структуре кода? А как можно изменить код, чтобы вышеуказанных проблем не стояло в принципе?

x
19 декабря 2018 г. 12:40
xintrea

Имеется объект класса QGeoPath , который хранит ~3500 точек. Заказчик требует, чтобы в программе была настройка, какую часть запомненного трека отрисовывать. Условно говоря, 150 точек, 300 точек, 500 точек, 1000, 2000, полный трек.

В самом классе QGeoPath нет возможности указать, на какой точке остановиться при отрисовке трека. Поэтому с таким классом видится только два пути:

  1. Делать копию объекта, укорачивать до нужной длинны, и этот объект и отрисовывать на карте Map .
  2. Или копировать только нужные данные из этого объекта в отображаемый и отрисовывать его на карте Map . (Возможно, это более оптимизированно, чем вариант 1, но не факт).

Небольшие подробности: экземпляр QGeoPath пополняется новыми точками 10 раз в секунду. Пока трек не достиг длинны 3500 точек, новые точки просто добавляются в «голову». Когда длинна становится 3500, работает алгоритм «змейки», то есть в голову добавляется точка, и в «хвосте» точка удаляется.

Класс QGeoPath - это, по сути,

QList<QGeoCoordinate>
. То есть, это не массив, а очень фрагментированная в памяти структура. Делать с нее копию таких данных 10 раз в сек, только для того, чтобы показать часть данных - это какой-то дикий оверхед.

Вопрос: как можно извратиться так, чтобы отображать часть трека наиболее оптимизированным способом?

x
4 декабря 2018 г. 14:55
xintrea

Сделал вот такой минимальный пример:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 500
    height: 500

    Rectangle
    {
        x: 0
        y: 0
        anchors.fill: parent
        color: "blue"
    }

    Rectangle
    {
        x: 0
        y: 0
        width: 100
        height: 100
        color: "red"
    }
}

Это просто окно с синим фоном и красным прямоугольником в левом верхнем углу.

Казалось бы, что тут может глючить? А глюки начинаются, когда меняется размер окна. Скриншоты сделать не могу, потому что в момент создания скриншота, окна, похоже, перерисовываются, и скриншот получается с «правильным» содержимым.

Поэтому выкладываю видео: https://youtu.be/0ewK6jrqWms

Видно, что если два раза нажать «Развернуть», то содержимое окна становится неправильным: синяя заливка начинается не сверху окна, а с каким-то вертикальным отступом. Красный квадрат тоже смещен вниз на этот же отступ.

Если двигать окно, то содержимое окна остается неправильным, но в какой-то момент вдруг перерисовывается, и снова становится правильным.

Вопрос: в чем проблема, и как сделать так, чтобы окно всегда отрисовывалось правильно? Это глюк на таком простом примере, а представьте что происходит в реальном проекте с кучей элементов с вычисляемыми размерами и масштабированием.
x
1 октября 2018 г. 11:31
xintrea

Имеется объект с QML-типом Map. Его id установлено как map. Отображается на нем Open Street Map. Мне нужно запретить вращение карты.

Я использую такой код:

map.gesture.rotationActive=false;

Однако он блокирует вращение именно жестом двумя пальцами. А на десктопе вращение карты с помощью Shift+КолесикоМышки все равно работает.

Вопрос: как заблокировать вращение карты полностью (т. е. чтобы север был всегда вверху)?
20 июля 2018 г. 13:30
Алексей Внуков

доброго времени суток, есть ListView, модель у него результат запроса из БД, делегатом выступает CheckBox, пользователь выбирает нужные чекбоксы в зависимости от чего в БД записываются разные данные. выбор может быть как множественным так и единичным. как мне проверить какие из чекбоксов были выбраны?
ListView
{
    id: list_doors
    anchors.fill: parent

    Component.onCompleted:  model = doorModel

    delegate: CheckBox 
{ text: DoorName indicator: Rectangle { implicitHeight:16 implicitWidth:16 radius: 3 border.color: activeFocus ? "darkblue" : "gray" border.width: 1 Rectangle
{ visible: checked color: "#555" border.color: "#333" radius: 1 anchors.margins: 4 anchors.fill: parent } } } }
d
13 июня 2018 г. 18:27
dmitry.maslov

Есть форма. Состоящую из элементов. Мы перекрываем все 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

Добрый день, подскажите пожалуйста. В слое 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 ;

  }



28 февраля 2018 г. 12:41
Terabaytus

Добрый день, подскажите уже какой день бьюсь с этим вопросом.  Работаю в QT5.10

Есть написанный на javaskript переключатель

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


Window {
    visible: true
    width: 200
    height: 50
    maximumHeight: height
    maximumWidth: width
    minimumHeight: height
    minimumWidth: width
    title: qsTr("")




    SwitchDelegate {
                id: control
                text: qsTr("          ")
                checked: false

                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"
                }
            }
}
как мне теперь получить сигнал о его состоянии влючён/выключен и вторым этапом включить его из кода  и так же выключить  в своём классе backend.cpp знаю что через SLOT и SIGNAL, но немогу понять.
x
8 февраля 2018 г. 12:22
xintrea

Не могу понять простую вещь: как в QML поменять цвет кнопки для типа Button из набора QtQuick.Controls 1.5

Я создаю свой тип кнопки так (файл MyPrettyButton.qml):

import QtQuick 2.0
import QtQuick.Controls 1.5
import QtQuick.Controls.Styles 1.4

Button {

    style: ButtonStyle {
        background: Rectangle {
            color: control.pressed ? "#989898" : "#a4ab90"
        }
    }
}

Но когда я использую такой тип, внешний вид кнопки сильно меняется:

  • Кнопка сплющивается раза в полтора по высоте
  • Иконка (задаваемая через iconSource) начинает прилипать к тексту надписи, вместо того чтобы находиться в левой части кнопки
Зато цвет кнопки меняется правильно.

Вопрос: как поменять цвет кнопки, не затрагивая ничего другого?
КА
19 февраля 2019 г. 18:32
Кристина Афанасьева

C++ - Тест 006. Перечисления

  • Результат:70баллов,
  • Очки рейтинга1
КА
19 февраля 2019 г. 18:26
Кристина Афанасьева

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

  • Результат:60баллов,
  • Очки рейтинга-1
КА
19 февраля 2019 г. 18:00
Кристина Афанасьева

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

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
21 февраля 2019 г. 12:51
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
21 февраля 2019 г. 12:29
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
21 февраля 2019 г. 12:08
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
21 февраля 2019 г. 12:04
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
21 февраля 2019 г. 11:54
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Сейчас обсуждают на форуме
21 февраля 2019 г. 8:58
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
20 февраля 2019 г. 21:55
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
20 февраля 2019 г. 15:06
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
20 февраля 2019 г. 14:40
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
20 февраля 2019 г. 10:34
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Присоединяйтесь к нам в социальных сетях

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