[Interest] QPainter, elastic rectangles

Constantin Makshin cmakshin at gmail.com
Mon Jul 29 04:43:06 CEST 2013


You're lucky it works at all -- the class member "evt_raw_ptr" is used by
paintEvent() without being set anywhere.
On Jul 29, 2013 2:10 AM, "Alexander Syvak" <alexander.svk at gmail.com> wrote:

> 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();
>
> }
>
>
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130729/3f85a6c0/attachment.html>


More information about the Interest mailing list