Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Interittent color



  • 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.



  • @CosimoMose
    Posta il codice che magari possiamo aiutarti meglio!



  • @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.



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



  • 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);
    }
    }



  • @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!



  • 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);
    }
    


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


Log in to reply