BlinCT
May 19, 2016, 3:56 p.m.

Переключение между двумя обьектами класса

handlers, id, qml, signals

Всем привет.
Пытаюсь решить такую задачу, в main.qml есть 4 контента с которыми надо работать.

CircleTimerContent  //Заполнение данными из файла CircleTimerContent
{
    id:circletimercontent
    anchors.top: parent.top
    anchors.topMargin: dp(125)
    anchors.horizontalCenter: parent.horizontalCenter
    width: dp(130)
    height: dp(130)
}
 
CircleTimerContent  //Заполнение данными из файла CircleTimerContent
{
    id:circletimercontent2
    anchors.top: circletimercontent.bottom
    anchors.right: circletimercontent.left
    anchors.left: parent.left
 
    anchors.topMargin: dp(10)
    anchors.horizontalCenter: parent.horizontalCenter
}
 
ToolBarContent  //Заполнение данными из файла ToolBarContent
{
    id: toolbarcontent
    onChecked:
    {
        settimecontent.flag = check
        circletimercontent.flag = check
        circletimercontent2.flag = check
    }
}
 
SetTimeContent  //Заполнение данными из файла SetTimeContent
{
    id:settimecontent
    anchors.top: toolbarcontent.bottom
    anchors.topMargin: dp(5)
}

Первые 2 это объекты одного класса, работают одинаково. На третьем располагается переключатель который меняет режимы для выше описанных 2 объектов. На 4 находится объект на котором есть текстовая надпись и поле ввода.

Описание CircleTimerContent.qml

import QtQuick 2.0
import CircleTimer 1.0
 
CircleTimer
{
    id: circletimer
    property alias flag: circleTimerClicked.flag
 
    Text
    {
        id: texttimer
        anchors.centerIn: parent
        font.bold: true
        font.pixelSize: 15
    }
 
    onCircleTimeChanged:
    {
        texttimer.text = Qt.formatTime(circleTime, "hh:mm:ss")
    }
 
    MouseArea
    {
        id: circleTimerClicked
        anchors.fill: parent
        property bool flag: true
        onClicked:
        {
            if(circletimer.isClickedTimer(circleTimerClicked.width, circleTimerClicked.height, mouse.x, mouse.y))
            {
                if(circleTimerClicked.flag === false)
                {
                    console.log("bla bla")
                }
                else
                {
                    if (circletimer.isRunning())
                    {
                        circletimer.stop();
                    }
                    else
                    {
                        circletimer.start();
                    }
                }
            }
        }
    }
}

Здесь есть 2 режима, это если флаг один то мы может работать с таймерами а если другой то что то посылать во внешку.

Данные из SetTimerContent.qml

Item
{
    id: timerValue
    property alias flag: testtext.flag
    Label
    {
        id: labeltext
        text: "Timer: "
        width: 50
    }
    TextField
    {
        id:testtext
        inputMask: ("NN:NN")
        text: "00:00"
        anchors.left: labeltext.right
        width: 55
        property bool flag: true
        readOnly: flag
        Keys.onPressed:
        {
            console.log(event.key)
            if(event.key === Qt.Key_Enter ||  event.key === Qt.Key_Return)
            {
                circletimercontent.timerValue = testtext.text
                circletimercontent.testTimerValue = testtext.text
                circletimercontent.clear();
 
            }
        }
    }
}

Здесь на минимуме что я пытаюсь сделать так это при нажатии на один из объектов CircleTimerContent послать в поле labletext.text (так мне кажется возможно реализовать) id выбранного объекта. То есть в label будет содержатся название или circletimercontent или circletimercontent2. Этим мы будем определять что было выбрано.
На максимуме я хочу чтобы при выборе одного из объектов из поля testtext.text уже заданные данные посылались именно в выбранный объект CircleTimerContent.
Я думаю что если пойму как решить минимальную задачу с надписью то второе уже будет близким по решению и решить смогу сам. Но вот примерно как с надписью при выборе очень плохо понятно(

0

Do you like it? Share on social networks!

1
Evgenii Legotckoi
  • May 20, 2016, 7:29 p.m.
  • The answer was marked as a solution.

Вот небольшой пример на эту тему, чтобы можно было выбирать какой-то целевой объект с помощью идентификаторов. В этом случае также необходимо использовать сигналы и обработчики сигналов. Ну а в CircleTimer объектах можно сделать также property alias для свойств text. Вместо них в примере даны Rectangle.

main.qml

import QtQuick 2.6
import QtQuick.Controls 1.5
 
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
 
    SetTimerContent  //Заполнение данными из файла SetTimeContent
    {
        id:settimercontent
        height: 50
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.topMargin: 10
        anchors.leftMargin: 10
        anchors.rightMargin: 10
 
        onSetTextToTarget: {
            switch(targetId)
            {
            case 1:
                text1.text = text
                break;
            case 2:
                text2.text = text
                break;
            }
        }
    }
 
    Rectangle {
        id: firstRectangle
        height: 50
        color: "blue"
        anchors {
            top: settimercontent.bottom
            left: parent.left
            right: parent.right
            topMargin: 10
            leftMargin: 10
            rightMargin: 10
        }
 
        Text {
            id: text1
            anchors.centerIn: parent
        }
 
        MouseArea {
            anchors.fill: parent
            onClicked: {
                settimercontent.targetId = 1
            }
        }
    }
 
    Rectangle {
        id: secondRectangle
        height: 50
        color: "red"
        anchors {
            top: firstRectangle.bottom
            left: parent.left
            right: parent.right
            topMargin: 10
            leftMargin: 10
            rightMargin: 10
        }
 
        Text {
            id:text2
            anchors.centerIn: parent
        }
 
        MouseArea {
            anchors.fill: parent
            onClicked: {
                settimercontent.targetId = 2
            }
        }
    }
}

SetTimerContent.qml

import QtQuick 2.5
import QtQuick.Controls 1.4
 
Item
{
    id: timerValue
    property alias flag: testtext.flag
    property alias targetId: testtext.targetId
 
    signal setTextToTarget(var text, var targetId)
 
    Label
    {
        id: labeltext
        text: "Timer: "
        width: 50
    }
    TextField
    {
        id:testtext
        inputMask: ("NN:NN")
        text: "00:00"
        anchors.left: labeltext.right
        width: 55
        property bool flag: false
        property int targetId: 1
        readOnly: flag
        Keys.onPressed:
        {
            console.log(event.key)
            if(event.key === Qt.Key_Enter ||  event.key === Qt.Key_Return)
            {
                setTextToTarget(testtext.text, testtext.targetId)
            }
        }
    }
}

 

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • AK
      April 1, 2025, 11:41 a.m.
      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup