Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QT scroll text for a GUI project
Forum Updated to NodeBB v4.3 + New Features

QT scroll text for a GUI project

Scheduled Pinned Locked Moved General and Desktop
4 Posts 3 Posters 4.1k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    G Offline
    gerteksa
    wrote on last edited by
    #1

    Hello.

    I'm trying to create a project that shows in a window an image and text, to show those objects in a LED panel. My LED panel has the size of 48x80 pixels or 80x48, it depends in the position we put it.

    My question is that we have to show text that we can see it setting the size of 13 for one of the font we've selected. The problem is that deppending on the length of the text we can't see all the letters. To show short words we haven't got a problem but when we put larger words or a phrase, we have problems because we can't see more than words that fit on the panel.

    We did a demo that uses a Qlabel, but as I've commented, I don't know how to scroll the text if it doesn't fit and know we have to plain it better. Maybe the solution is use different class but I don't know which is the best because I'm new in programming in Qt.

    Do you know a class or how to solve this problem?

    1 Reply Last reply
    0
    • JeroentjehomeJ Offline
      JeroentjehomeJ Offline
      Jeroentjehome
      wrote on last edited by
      #2

      Hi,
      Did you take a look at the QTextBrowser? It has automatic scrollbars when needed. (offcourse settable in software).

      Greetz, Jeroen

      1 Reply Last reply
      0
      • S Offline
        S Offline
        Slion
        wrote on last edited by
        #3

        Looks like you could use code from the following thread:
        http://qt-project.org/forums/viewthread/43379/
        Go for the animations version as the animators are lagging.

        1 Reply Last reply
        0
        • G Offline
          G Offline
          gerteksa
          wrote on last edited by
          #4

          Finally I used this code I obtained from: http://stackoverflow.com/questions/10651514/text-scrolling-marquee-in-qlabel

          *MarqueeLabel.h
          *
          @#ifndef MARQUEELABEL_H
          #define MARQUEELABEL_H

          #include <QLabel>
          #include <QTimer>
          //#include <QtDesigner/QDesignerExportWidget>

          //class QDESIGNER_WIDGET_EXPORT MarqueeLabel : public QLabel
          class MarqueeLabel : public QLabel
          {
          Q_OBJECT

          public: //Member Functions
          MarqueeLabel(QWidget *parent = 0);
          ~MarqueeLabel();
          void show();
          void setAlignment(Qt::Alignment);
          //int getSpeed();
          float getSpeed();

          public slots: //Public Member Slots
          //void setSpeed(int s);
          void setSpeed(float s);

          protected: //Member Functions
          void paintEvent(QPaintEvent *evt);
          void resizeEvent(QResizeEvent *evt);
          void updateCoordinates();

          private: //Data Members
          //int px;
          float px;
          //int py;
          float py;
          QTimer timer;
          Qt::Alignment m_align;
          //int speed;
          float speed;
          //int fontPointSize;
          float fontPointSize;
          //int textLength;
          float textLength;

          private slots: //Private Member Slots
          void refreshLabel();
          };

          #endif // MARQUEELABEL_H@

          *MarqueeLabel.cpp
          *
          @#include "MarqueeLabel.h"
          #include <QPainter>

          MarqueeLabel::MarqueeLabel(QWidget *parent)
          {
          px = 0;
          py = 15;
          speed = 2;
          connect(&timer, SIGNAL(timeout()), this, SLOT(refreshLabel()));
          timer.start(10);
          }

          void MarqueeLabel::refreshLabel()
          {
          repaint();
          }

          MarqueeLabel::~MarqueeLabel()
          {
          }

          void MarqueeLabel::show()
          {
          QLabel::show();
          }

          void MarqueeLabel::setAlignment(Qt::Alignment al)
          {
          m_align = al;
          updateCoordinates();
          QLabel::setAlignment(al);
          }

          void MarqueeLabel::paintEvent(QPaintEvent evt)
          {
          /

          * FROM RIGHT TO LEFT
          */
          QPainter p(this);
          px -= speed;
          if(px <= (-textLength))
          {
          px = width();
          }
          p.drawText(px, py+fontPointSize, text()); //DESPLAZA Y RECARGA EL TEXTO
          //p.drawText(px+width(), py+fontPointSize, text()); //DESPLAZA PERO NO RECARGA EL TEXTO
          //p.drawText(px-width(), py+fontPointSize, text()); //NO MUESTRA NADA
          p.translate(px,0);

          /*
          //CHANGES DIRECTION OF THE TEXT
          QPainter p(this);
          px -= speed;
          if(px <= (-textLength))
          {
          px = height(); // LOADS FASTER THAN px = width();
          }
          p.rotate(-90);
          //p.drawText(px, py+fontPointSize, text()); //DESPLAZA Y RECARGA EL TEXTO
          p.drawText(px, py+fontPointSize, text()); //DESPLAZA Y RECARGA EL TEXTO
          p.translate(px,0);
          */

          QPainter p(this);
          px -= speed;
          if(px <= (-textLength))
          {
             //px = width();
              px = height(); //LA RECARGA DEL TEXTO ES MAS RAPIDA CUANDO FINALIZA EL SCROLL EN VEZ DE px = width();
          }
          p.rotate(-90);
          p.drawText(px, py+fontPointSize, text()); //DESPLAZA Y RECARGA EL TEXTO
          p.translate(px,0);
          

          }

          void MarqueeLabel::resizeEvent(QResizeEvent *evt)
          {
          updateCoordinates();
          QLabel::resizeEvent(evt);
          }

          void MarqueeLabel::updateCoordinates()
          {
          switch(m_align)
          {
          case Qt::AlignTop:
          py = 10;
          break;
          case Qt::AlignBottom:
          py = height()-10;
          break;
          case Qt::AlignVCenter:
          py = height()/2;
          break;
          }
          fontPointSize = font().pointSize()/2;
          textLength = fontMetrics().width(text());
          }

          //void MarqueeLabel::setSpeed(int s)
          void MarqueeLabel::setSpeed(float s)
          {
          speed = s;
          }

          //int MarqueeLabel::getSpeed()
          float MarqueeLabel::getSpeed()
          {
          return speed;
          }
          @

          *main.cpp
          *
          @#include <QApplication>
          #include "mainwindow.h"

          #include "MarqueeLabel.h" //PARA UTILIZAR EL TEXTO EN MOVIMIENTO.
          #include <QFontMetrics> //CALCULA VALORES PARA LAS FUENTES UTILIZADAS, alturas
          #include <qdebug.h> //PARA PODER UTILZIAR qDebug();

          #define VELOCIDAD_DE_SCROLL 0.25

          int main(int argc, char *argv[])
          {
          QApplication app(argc, argv);

          MarqueeLabel lbl;
          QFont f("Verdana", 20, 15);
              //Con un tamaño de fuente de 30, ocupamos de alto 48 pixeles, el tope del panel en posicion horizontal
              //Con un tamaño de fuente de 20, ocupamos de alto 32 pixeles, el tope del panel en posicion vertical, para la parte 3x2
          QFontMetrics prop_font(f);
          
          
          int altura_font = prop_font.height();
          int anchura_font = prop_font.width("PROXIMA SALIDA A 2KM POR ACCIDENTE");
          qDebug() << "Altura fuente: " << altura_font << "";
          qDebug() << "Anchura fuente: " << anchura_font << "";
          
          
          lbl.setFont(f);
          lbl.setSpeed(VELOCIDAD_DE_SCROLL);
          lbl.setAlignment(Qt::AlignLeft); //la alineacion Horizontal es la mas adecuada para que el texto se muestre verticalmente
          //lbl.setAlignment(Qt::AlignVCenter);
          //lbl.setWindowFlags(Qt::CustomizeWindowHint);
          lbl.setText("PROXIMA SALIDA");
          lbl.show();
          
          app.setQuitOnLastWindowClosed(true);
          
          return app.exec();
          

          }@

          In this moment I have for my LED panel the scroll text in a vertical position working correctly. I need that the text scrolls vertically, but I don't know how to change it. As you can see in the text, if I use rotate(-90) method, it changes all the orientation of the all the QPainter, but I only need to change the words of the QPainter, something like in C:

          @#include <stdio.h>
          #include <string.h>
          #include <unistd.h> //it allows to use usleep

          char string_to_scroll[256] = "THIS IS THE STRING WE WANT TO SCROLL";
          int size = strlen(string_to_scroll);
          int i = 0;

          int main (void)
          {
          while(1)
          {
          for(i = 0; i < size; i++)
          {
          printf("\t%c\n", string_to_scroll[size - i]);
          }

              if(i == size-1)
          

          {
          printf("\t \n");
          }

          usleep(125000);

          }
          return 0;
          }@

          Any ideas about how to implement something like this in Qt, using the MarqueeLabel class?

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved