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