[Interest] QPainter, elastic rectangles

Alexander Syvak alexander.svk at gmail.com
Mon Jul 29 00:10:23 CEST 2013


Hello,

here's the code below, when a rectangle is being drawin (the mouse is being
moved) it draws one rectangle somewhere far from the hot mouse point and
that's it (while it's expected dyamical behavior). Does anybody know why?

#include <QtGui>

#include <QPen>

#include <QRegion>

#include <QPainter>

#include <QWidget>

#include <QEvent>

#include <QPalette>

#include <QMouseEvent>

#include <QPen>

#include <QWidget>

#include <QCoreApplication>


class pattern_qualifier : public QWidget

{

public:

    pattern_qualifier(QWidget* parent = 0);


protected:

    void paintEvent(QPaintEvent*);

    void mousePressEvent(QMouseEvent* evt_raw_ptr);

    void mouseMoveEvent(QMouseEvent* evt_raw_ptr);

    void mouseReleaseEvent(QMouseEvent* evt_raw_ptr);

private:

    inline int get_x(QMouseEvent* evt_raw_ptr) const

    {

        return evt_raw_ptr->x();//globalX();

    }

    inline int get_y(QMouseEvent* evt_raw_ptr) const

    {

        return evt_raw_ptr->y();//globalY();

    }

    void install_palette();

    bool ltop_is_set;

    QRegion region;

    quint8 x1, y1, x2, y2;

    QPen elastic_rect_pen, region_pen;

    QColor black, white;

    bool on_release, msg;

    QMouseEvent* evt_raw_ptr;

};


pattern_qualifier::pattern_qualifier(QWidget* parent):
QWidget(parent), ltop_is_set(false), x1(0), x2(0), y1(0), y2(0),
on_release(false), msg(false)

{

    install_palette();

    elastic_rect_pen.setStyle(Qt::PenStyle::DashLine);

    elastic_rect_pen.setColor(Qt::black);

    //elastic_rect_pen.setBrush(QBrush(Qt::white));


    region_pen.setStyle(Qt::PenStyle::SolidLine);

    region_pen.setColor(black);

    //region_pen.setBrush(QBrush(black));

}


void pattern_qualifier::mousePressEvent(QMouseEvent * evt_raw_ptr)

{

    if ( evt_raw_ptr != nullptr && !ltop_is_set &&
evt_raw_ptr->button() == Qt::LeftButton )

    {

        x1 = x2 = get_x(evt_raw_ptr), y1 = y2 = get_y(evt_raw_ptr); //
A : To avoid a shaking motion (pos() yields a position relative to a
widget).

        ltop_is_set = true;

    }

    else QWidget::mousePressEvent(evt_raw_ptr);

}


void pattern_qualifier::mouseMoveEvent(QMouseEvent* evt_raw_ptr)

{

    qDebug() << evt_raw_ptr->button();

    if ( hasMouseTracking() == false )

        if ( evt_raw_ptr != nullptr )

            if ( evt_raw_ptr->button() == Qt::NoButton )

    {

//        QPainter painter(this);
//painter.setRenderHint(QPainter::Antialiasing);

//        auto const prev_pen = painter.pen();

//        painter.setPen(elastic_rect_pen);

//        painter.eraseRect( x1, y1, std::abs( x2 - x1 ), std::abs( y2 - y1 ) );

//        x2 = get_x(evt_raw_ptr), y2 = get_y(evt_raw_ptr);

//        painter.drawRect( x1, y1, std::abs( x2 - x1 ), std::abs( y2 - y1 ) );

//        painter.setPen(prev_pen);

        on_release = false, msg = true;

        //QCoreApplication::sendEvent(this,new QPaintEvent(rect()));

        //update();

       // qDebug() << "got mousemove";

        repaint();

        msg = false;

    }

    else QWidget::mouseMoveEvent(evt_raw_ptr);

}


void pattern_qualifier::mouseReleaseEvent(QMouseEvent* evt_raw_ptr)

{

    if ( evt_raw_ptr != nullptr && evt_raw_ptr->button() == Qt::LeftButton )

    {

        on_release = true, msg = true;

        //QCoreApplication::sendEvent(this,new QPaintEvent(rect()));

        msg = false;

    }

    else QWidget::mouseReleaseEvent(evt_raw_ptr);

}


void pattern_qualifier::install_palette()

{

    QPalette palette(pattern_qualifier::palette());

    palette.setColor(QPalette::ColorGroup::Active,
QPalette::ColorRole::Window, Qt::white);

    setPalette(palette);

}


void pattern_qualifier::paintEvent(QPaintEvent *)

{

    if ( msg )

    {

        if ( !on_release )

        {

            QPainter painter(this);
//painter.setRenderHint(QPainter::Antialiasing);

           // qDebug() << "on_move_update";

            auto const prev_pen = painter.pen();

            painter.setPen(elastic_rect_pen);

            painter.eraseRect( x1, y1, x2 - x1, y2 - y1 );

            x2 = get_x(evt_raw_ptr), y2 = get_y(evt_raw_ptr);

            painter.drawRect( x1, y1, x2 - x1, y2 - y1 );

            painter.setPen(prev_pen);

        }

        else

        {

            qDebug() << "on_release";

            QPainter painter(this);

            auto const prev_pen = painter.pen();

            painter.setPen(elastic_rect_pen);

            painter.eraseRect( x1, y1, std::abs( x2 - x1 ), std::abs(
y2 - y1 ) );

            x2 = get_x(evt_raw_ptr), y2 = get_y(evt_raw_ptr);

            painter.setPen(region_pen);

            QRect subrect( x1, y1, std::abs( x2 - x1 ), std::abs( y2 - y1 ) );

            painter.drawRect( subrect );\

            painter.setPen(prev_pen);

            region |= subrect;

        }

     }

    else

    {

        QPainter painter(this);

        painter.setRenderHint(QPainter::Antialiasing);

        painter.setPen(Qt::darkGreen);

        painter.drawRect(1, 2, 600, 400);


        painter.setPen(Qt::darkGray);

        painter.drawLine(2, 8, 6, 2);

    }

}


int main(int argc, char *argv[])

{

    QApplication app(argc, argv);

    pattern_qualifier widget;

    widget.setWindowFlags(Qt::FramelessWindowHint);

    auto const full_screen_rect = QApplication::desktop()->availableGeometry();

    widget.setGeometry(full_screen_rect);

    widget.showMaximized();

    return app.exec();

}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130729/db66b6ff/attachment.html>


More information about the Interest mailing list