Trying to create a direction indicator. Other methods than QPainter?



  • I'm currently using QPainter and designed my lamps for the direction indicator. I want to change the mainwindow by clicking a button. So when I click the button for the left direction indicator, the mainwindow should update the background-colour of my polygon for the left blinker every second. Is there any better method than using QPainter?

    Thanks for your answers.


  • Qt Champions 2017

    Hi
    What would make it a better method than QPainter ?
    Also how do u draw the poly?
    Using painter ?



  • @mrjj yes right now I'm using the painter. I've created a paintevent and then used the qpainter to create the polygons. But i don't know, if i can edit the paintevent and the specific painter, so that the indicators change the colour every time skip. This is all happening in the mainwindow.cpp.


  • Qt Champions 2017

    @Wosch
    it sounds fine to me but not sure what
    "direction indicator. " really is. How it should be drawn but
    painter is fast and flexible.



  • @mrjj it should look like the blinker in your car or better like the dashboard. So when i press the button for the left blinker, the left arrow should switch from white to yellow and back in a time scale. But i'm not sure how to call the qtpaintevent in another method(button pressed()) so i can change the painter I created for the arrows.


  • Moderators

    @Wosch No need to call paintEvent from other method. In you button slot you simply set a variable. In your paintEvent you check the value of this variable and depending on it draw what needs to be drown.

    void MainWindow::onButtonCliecked()
    {
        drawArrow = true;
    }
    
    void MainWindowPaintEvent(...)
    {
        if (drawArrow) {
            // Draw arrow
        }
    }
    

  • Qt Champions 2017

    @Wosch
    Hi
    To triggers something to re-draw, you can call its update()
    You will never call its paintEvent directly.

    So to add to @jsulm

    often you would do
    void MainWindow::onButtonCliecked()
    {
    drawArrow = true;
    update();
    }

    to make it redraw as soon as you change arrow



  • @Wosch hi, since you're specifically asking for an alternative, I'll post a custom class (of a QPushButton in this case) that has a "blinking-functionality" using Q_Property and StyleSheets

    #ifndef CBUTTON_H
    #define CBUTTON_H
    
    #include <QStyle>
    #include <QPushButton>
    #include <QTimer>
    
    class cButton : public QPushButton
    {
        Q_OBJECT
        Q_PROPERTY(bool state READ isState WRITE changeState)
    
    public:
        explicit cButton(QWidget * parent = 0) :  QPushButton(parent){
            this->setStyleSheet("QPushButton{background-color: black;}
                                                     QPushButton[state = true]{background-color: red;}");
            changeTimer.setInterval(1000);
            connect(&changeTimer, &QTimer::timeout, this, cButton::flipState);
        }
        void start(){changeTimer.start());
        void stop(){changeTimer.stop());
    
        bool isState(){return state;}
    
    public slots:
       void flipState(){changeState(!isState());}
    
        void changeState(bool b){
            if(state != b){
                 state = b;
                 style()->unpolish(this);
                 style()->polish(this);
                repaint();
           }
        }
    
    protected:
        QTimer changeTimer;
        bool state = false;
    
    };
    
    #endif // CBUTTON_H
    


  • @J-Hilk @jsulm @mrjj Thank you guys. That's what i was looking for.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.