Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Interittent color
Forum Updated to NodeBB v4.3 + New Features

Interittent color

Scheduled Pinned Locked Moved Solved Italian
8 Posts 3 Posters 1.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.
  • C Offline
    C Offline
    CosimoMose
    wrote on last edited by
    #1

    Ciao, sono Cosimomose.
    Ho un problema perché non riesco a creare un semplice colore intermittente
    su una figura come un riquadro. Utilizzando il ciclo "for" con l'opzione "if"
    al suo interno il programma legge solo l'ultimo colore. Questo accade sia nella mainwindow che in una funzione relativa ad un tasto. Preciso che non ho problemi per visualizzare la figura nel GraphicsView.

    C 1 Reply Last reply
    0
    • guerinoniG Offline
      guerinoniG Offline
      guerinoni
      wrote on last edited by
      #2

      @CosimoMose
      Posta il codice che magari possiamo aiutarti meglio!

      1 Reply Last reply
      0
      • C CosimoMose

        Ciao, sono Cosimomose.
        Ho un problema perché non riesco a creare un semplice colore intermittente
        su una figura come un riquadro. Utilizzando il ciclo "for" con l'opzione "if"
        al suo interno il programma legge solo l'ultimo colore. Questo accade sia nella mainwindow che in una funzione relativa ad un tasto. Preciso che non ho problemi per visualizzare la figura nel GraphicsView.

        C Offline
        C Offline
        CosimoMose
        wrote on last edited by VRonin
        #3

        @CosimoMose Ciao. Il mio problema consiste nel fatto che la figura che visualizzo
        non mostra prima un colore e poi il secondo in successione. Viene visualizzato
        solo l'ultimo colore. Il codice è il seguente:

        #include "main_window.h"
        #include "ui_main_window.h"
        #include <QTimer>
        #include <QBrush>
        
        MainWindow::MainWindow(QWidget *parent)
            : QMainWindow(parent)
            , ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
        }
        MainWindow::~MainWindow()
        {
            delete ui;
        }
        void MainWindow::on_pushButton_clicked()
        {
            QGraphicsScene *scene = new QGraphicsScene;
            QBrush redBrush(Qt::red);
            QBrush blueBrush(Qt::blue);
            QPen blackpen(Qt::black);
        
            for (int i=1;i<=2;i++)
              {
                QTimer *timer =new QTimer(this);
                if (i==1) scene->addRect(10,10,100,100,blackpen,redBrush);
                else scene->addRect(10,10,100,100,blackpen,blueBrush);
                ui->graphicsView->setScene(scene);
                timer->start(2000);
              }
        }
        

        Grazie e per l'aiuto.

        1 Reply Last reply
        0
        • guerinoniG Offline
          guerinoniG Offline
          guerinoni
          wrote on last edited by
          #4

          @CosimoMose
          la connessione con il segnale di timeout del timer non esiste?

          1 Reply Last reply
          0
          • C Offline
            C Offline
            CosimoMose
            wrote on last edited by
            #5

            Ringrazio @guerinoni per la sua attenzione. Il motivo per cui non lo avevo fatto
            prima è che non esiste un ricevitore in questo caso, quindi non so cosa metterci al posto dei puntini nel codice che segue. Nell'aspettare una cortese risposta voglio fare un ipotesi da profano e incompetente. Il fatto che il compilatore
            riscriva il codice macchina in modo da leggere solo l'ultimo colore, o elemento
            cambiante, tralasciando il precedente è un fattore costitutivo del sistema. Sono
            giunto a questa conclusione, da inesperto, perché ci sono funzioni create appositamente
            per aggirare tale problema. Mi riferisco a QWidget::update() , la quale funziona
            come se fosse un 'goto' . Il problema ulteriore è comprendere come scrivere le funzioni update(), repaint() e la loro interazione con paintEvent() . Non ho trovato
            esempi ed i miei tentativi hanno fallito. Mi sembra che abbinare queste ultime
            insieme a QThread::sleep() sia la cosa più logica da fare. Preciso che il codice precedente è scritto proprio male secondo i miei parametri ma è così perché
            è l'ultimo dei tentativi che ho fatto.
            void MainWindow::on_pushButton_clicked()
            {
            QGraphicsScene *scene = new QGraphicsScene;
            QBrush redBrush(Qt::red);
            QBrush blueBrush(Qt::blue);
            QPen blackpen(Qt::black);
            for (int i=1;i<=2;i++)
            {
            //QThread::sleep(2); <--Alternativa non funzionante per risolvere il problema.
            QTimer *timer =new QTimer(this);
            connect(timer, SIGNAL(timeout()), this, SLOT(.........)); // Cosa scrivo al posto
            // dei puntini,visto che
            // non c'è un ricevitore
            // del segnale?
            if (i==1) scene->addRect(10,10,100,100,blackpen,redBrush);
            else scene->addRect(10,10,100,100,blackpen,blueBrush);
            ui->graphicsView->setScene(scene);
            //timer->start(2000);
            }
            }

            guerinoniG 1 Reply Last reply
            0
            • C CosimoMose

              Ringrazio @guerinoni per la sua attenzione. Il motivo per cui non lo avevo fatto
              prima è che non esiste un ricevitore in questo caso, quindi non so cosa metterci al posto dei puntini nel codice che segue. Nell'aspettare una cortese risposta voglio fare un ipotesi da profano e incompetente. Il fatto che il compilatore
              riscriva il codice macchina in modo da leggere solo l'ultimo colore, o elemento
              cambiante, tralasciando il precedente è un fattore costitutivo del sistema. Sono
              giunto a questa conclusione, da inesperto, perché ci sono funzioni create appositamente
              per aggirare tale problema. Mi riferisco a QWidget::update() , la quale funziona
              come se fosse un 'goto' . Il problema ulteriore è comprendere come scrivere le funzioni update(), repaint() e la loro interazione con paintEvent() . Non ho trovato
              esempi ed i miei tentativi hanno fallito. Mi sembra che abbinare queste ultime
              insieme a QThread::sleep() sia la cosa più logica da fare. Preciso che il codice precedente è scritto proprio male secondo i miei parametri ma è così perché
              è l'ultimo dei tentativi che ho fatto.
              void MainWindow::on_pushButton_clicked()
              {
              QGraphicsScene *scene = new QGraphicsScene;
              QBrush redBrush(Qt::red);
              QBrush blueBrush(Qt::blue);
              QPen blackpen(Qt::black);
              for (int i=1;i<=2;i++)
              {
              //QThread::sleep(2); <--Alternativa non funzionante per risolvere il problema.
              QTimer *timer =new QTimer(this);
              connect(timer, SIGNAL(timeout()), this, SLOT(.........)); // Cosa scrivo al posto
              // dei puntini,visto che
              // non c'è un ricevitore
              // del segnale?
              if (i==1) scene->addRect(10,10,100,100,blackpen,redBrush);
              else scene->addRect(10,10,100,100,blackpen,blueBrush);
              ui->graphicsView->setScene(scene);
              //timer->start(2000);
              }
              }

              guerinoniG Offline
              guerinoniG Offline
              guerinoni
              wrote on last edited by
              #6

              @CosimoMose
              Probabilmente devi ancora prendere confidenza con questo framework, Qt e' basato su eventi, quindi quelle funzioni che pensi di dover chiamare "a mano" in realta' non servono perche' alla modifica di un elemento il widget verra' rinfrescato automaticamente.
              Adesso ipotizzando che tu debba colorare un pulsante:
              connect(&ui->myButton, &QPushButton::clicked, this, &MainWindow::setFirstColorOnButton); (questa e' la connessione tra il segnale di click e la funzione che imposta il primo colore)
              poi dovrai collegare un timer and un'altra funzione in modo che nella prima funzione setFirstColorOnButton metti un colore e fai partire un timer ed allo scadere di questi secondi venga chiamata la seconda funzione per effetture il cambio di colore!
              Tutto questo lascia libero il resto dell'applicativo per i vari aggiornamenti e l'esecuzione del resto del codice!

              1 Reply Last reply
              1
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by VRonin
                #7
                void MainWindow::on_pushButton_clicked()
                {
                    QGraphicsScene *scene = ui->graphicsView->scene();
                    if(!scene){
                        scene = new QGraphicsScene(this);
                        ui->graphicsView->setScene(scene);
                    }
                    const QBrush redBrush(Qt::red);
                    const QBrush blueBrush(Qt::blue);
                    QTimer *timer =new QTimer(this);
                    QGraphicsRectItem* rect = scene->addRect(10,10,100,100,QPen(Qt::black),redBrush);
                    QObject::connect(timer, &QTimer::timeout, [=]()->void{
                        if(rect->brush()==redBrush)
                            rect->setBrush(blueBrush);
                        else
                            rect->setBrush(redBrush);
                    });
                    timer->start(2000);
                }
                

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                1
                • C Offline
                  C Offline
                  CosimoMose
                  wrote on last edited by
                  #8

                  Ciao, grazie a @guerinoni e a @VRonin per il suggerimento
                  sull'intermittente del colore.

                  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