Qt/QML - przesuwajacy sie tekst znika, lub zbyt dluga przerwa miedzy kolejnymi powtorzeniami

0

Mam taki kod, jak ponizej. Ogolnie kod dziala i tekst sie przesuwa od prawej do lewej, ale mam kilka problemow, ktore nie wiem, jak obejsc.

  1. Jak tekst jest dluzszy, niz ten wirtualny pasek (from: mainwindow.width / to: -mainwindow.width), to w pewnym momencie tekst znika (nie chowa sie po lewej, tylko znika) i zaczyna ponownie sie pojawiac po prawej stronie
  2. Jak tekst jest duzo krotszy, niz ten wirtualny pasek, to trzeba dlugo czekac, az kolejna iteracja pojawi sie po prawej.

Domyslam sie, czemu tak sie dzieje, ale nie bardzo wiem jak to rozwiazac.

Nie wiem, czy kojarzycie, ale kiedys pod windowsa byl program do czytania kanalow rss o nazwie paseczek i cos wtym stylu chcialbym osiagnac, czyli, ze wrzucam jakies elementy do listy i ta lista pojawia sie na pasku i sie przewija bez konca, dopoki nie usune jakiegos elementu, lub nie minie jakis timeout.
Nie wiem, jak zapetlic taka liste i zeby nie bylo takich przerw, lub znikania tekstu z paska.

import QtQuick.Window 2.11


Rectangle {
    id: movingbar
    objectName: "movingbar"

    width: parent.width
    height: parent.height*0.1
//    color: "red"
    color: "transparent"
    antialiasing: true
    border.color: "yellow"
    x: 0
    y: mainwindow.height-movingtext.height


    Text
    {
        id: movingtext
        x: 0
        y: 0
        text: "Dolny pasek QWERT DFGDFgh DFGHWTHRTh rhthGHTY J tyj etytyj e yETYETY ty te DFGDFgh DFGHWTHRTh rhthGHTY"
        color: "yellow"
        font.pixelSize: mainwindow.height*0.05
        clip: true

        NumberAnimation on x
        {
            id: movingtext_animation
            easing.type: Easing.Linear
            from: mainwindow.width
            to: -mainwindow.width
            loops: Animation.Infinite
            duration: 7500
            running: true
        }
    }
}



0

Udało mi się rozwiązać problem z przewijaniem krótkich tekstów. Trzeba było dodać taki kod jak ponizej. Mowiac w skrocie, jak prawy koniec tekstu dojdzie do lewej krawedzi, to restartuje animacje, czyli tekst zaczyna sie przewijac od prawej.

        onXChanged:
        {
            if ((movingtext.x + movingtext.width) <= 0)
            {
                movingtext_animation.restart()
            }
        }

Poniżej cały kod:

import QtQuick 2.0
import QtQuick.Window 2.11


Rectangle {
    id: movingbar
    objectName: "movingbar"

    width: parent.width
    height: parent.height*0.1
//    color: "red"
    color: "transparent"
    antialiasing: true
    border.color: "yellow"
    x: 0
    y: mainwindow.height-movingtext.height


    Text
    {
        id: movingtext
        x: 0
        y: 0
//        text: "Dolny pasek 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10"
        text: "Dolny pasek"
        color: "yellow"
        font.pixelSize: mainwindow.height*0.05



        NumberAnimation on x
        {
            id: movingtext_animation
            easing.type: Easing.Linear
            from: mainwindow.width
            to: -mainwindow.width


            loops: Animation.Infinite
            duration: 10000
            running: true
        }
        onXChanged:
        {

            if ((movingtext.x + movingtext.width) <= 0)
            {
                movingtext_animation.restart()
            }
        }
    }
}



Niestety, ale nadal walczę z tekstami dłuższymi, niż szerokość ekranu.

Z tego co widze, to problem jest zwiazany z okresleniem pola "to". Probuje ustawic wielkosc tej zmiennej na podstawie szerokosci tekstu, ale chyba cos tu nie dziala, albo ja czegos nie rozumiem, Jak ustawie wartosc duzo wieksza, to wtedy dziala takze z dlugii tekstami, ale docelowo, nie wiem jak dlugi ten tekst bedzie, wiec ciezko okreslic sensowna wartosc.

0

O to ci chodziło:
https://tinyurl.com/2lkehcvb

// import QtQuick.Window 2.11
import QtQuick 2.11

Rectangle {
    id: movingbar
    objectName: "movingbar"

    width: parent.width
    height: parent.height*0.1
    color: "red"
//    color: "transparent"
    antialiasing: true
    border.color: "yellow"

    Text
    {
        id: movingtext
        x: 0
        y: 0
        text: "Dolny pasek QWERT DFGDFgh DFGHWTHRTh rhthGHTY J tyj etytyj e yETYETY ty te DFGDFgh DFGHWTHRTh rhthGHTY"
        color: "yellow"
        font.pixelSize: movingbar.height*0.5
        clip: true

        NumberAnimation on x {
            id: movingtext_animation
            easing.type: Easing.Linear
            from: movingbar.width
            to: -movingtext.contentWidth
            loops: Animation.Infinite
            duration: (movingtext.contentWidth + movingbar.width) * 5.0
            running: true
        }
    }
}
0
MarekR22 napisał(a):

O to ci chodziło:
https://tinyurl.com/2lkehcvb

// import QtQuick.Window 2.11
import QtQuick 2.11

Rectangle {
    id: movingbar
    objectName: "movingbar"

    width: parent.width
    height: parent.height*0.1
    color: "red"
//    color: "transparent"
    antialiasing: true
    border.color: "yellow"

    Text
    {
        id: movingtext
        x: 0
        y: 0
        text: "Dolny pasek QWERT DFGDFgh DFGHWTHRTh rhthGHTY J tyj etytyj e yETYETY ty te DFGDFgh DFGHWTHRTh rhthGHTY"
        color: "yellow"
        font.pixelSize: movingbar.height*0.5
        clip: true

        NumberAnimation on x {
            id: movingtext_animation
            easing.type: Easing.Linear
            from: movingbar.width
            to: -movingtext.contentWidth
            loops: Animation.Infinite
            duration: (movingtext.contentWidth + movingbar.width) * 5.0
            running: true
        }
    }
}

U mnie ten kod nie dziala tak jak trzeba. Musialem zmienic pole duration na wartosc liczbowa (zamiast zmiennej) i wtedy animacja sie ruszyla, ale zachowanie jest inne, niz na stronie. Poczatek tekstu dochodzi do lewej strony i animacja sie restartuje, czyli tekst znika i zaczyna od prawej.

0
from: movingbar.width
to: -(movingbar.width+movingtext.contentWidth)
0
Paweleczek napisał(a):

U mnie ten kod nie dziala tak jak trzeba. Musialem zmienic pole duration na wartosc liczbowa (zamiast zmiennej) i wtedy animacja sie ruszyla, ale zachowanie jest inne, niz na stronie. Poczatek tekstu dochodzi do lewej strony i animacja sie restartuje, czyli tekst znika i zaczyna od prawej.

Z moich eksperymentów na tej stronie, wynika, że zmiana rozmiaru movingbar nie aktualizuje właściwości animacji i wtedy animacja kończy się w złym momencie :( (bo używa starej szerokości).
Ergo twój UI zmienia swój rozmiar i wtedy wychodzi ten problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1