[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