diff options
-rw-r--r-- | src-qt5/src-glwidgets/gltest/main.cpp | 25 | ||||
-rwxr-xr-x | src-qt5/src-glwidgets/gltest/test | bin | 50927 -> 56367 bytes | |||
-rw-r--r-- | src-qt5/src-glwidgets/glw-base.cpp | 7 | ||||
-rw-r--r-- | src-qt5/src-glwidgets/glw-widget.cpp | 36 | ||||
-rw-r--r-- | src-qt5/src-glwidgets/glw-widget.h | 21 |
5 files changed, 78 insertions, 11 deletions
diff --git a/src-qt5/src-glwidgets/gltest/main.cpp b/src-qt5/src-glwidgets/gltest/main.cpp index 041ee5ff..c3edd088 100644 --- a/src-qt5/src-glwidgets/gltest/main.cpp +++ b/src-qt5/src-glwidgets/gltest/main.cpp @@ -2,7 +2,8 @@ #include <QApplication> #include <QTimer> #include <QColor> - +#include <QPushButton> +#include <QPropertyAnimation> #include "../glw-base.h" #include "../glw-widget.h" @@ -14,10 +15,28 @@ int main(int argc, char** argv){ GLW_Base base; qDebug() << "Resize base widget"; base.resize(200,200); - qDebug() << "Create colorchange"; + qDebug() << "Create Other widgets"; + GLW_Widget wgt1(&base); + wgt1.setGLBase(&base); + wgt1.setGeometry(50,50,50,50); + wgt1.setDraggable(true); GLW_Widget wgt(&base); wgt.setGLBase(&base); - wgt.setGeometry(50,50,50,50); + wgt.setGeometry(75,50,50,50); + QPropertyAnimation anim(&wgt); + anim.setTargetObject(&wgt); + anim.setPropertyName("geometry"); + //anim.setStartValue(QRect(-50,-50,50,50)); + //anim.setEndValue(QRect(200,200,50,50)); + anim.setStartValue(QRect(100,100,0,0)); + anim.setEndValue(QRect(0,0,200,200)); + anim.setDuration(1500); + anim.setLoopCount(-1); + anim.start(); + /*QPushButton but(&base); + but.setText("button"); + but.setGeometry(100,100,50,50); + but.setStyleSheet("background: rgba(0,150,0,125)");*/ colorchange CC(&base); qDebug() << "Start Event loop"; base.show(); diff --git a/src-qt5/src-glwidgets/gltest/test b/src-qt5/src-glwidgets/gltest/test Binary files differindex 5a69b0c3..cb8fe872 100755 --- a/src-qt5/src-glwidgets/gltest/test +++ b/src-qt5/src-glwidgets/gltest/test diff --git a/src-qt5/src-glwidgets/glw-base.cpp b/src-qt5/src-glwidgets/glw-base.cpp index e828df7f..8841743d 100644 --- a/src-qt5/src-glwidgets/glw-base.cpp +++ b/src-qt5/src-glwidgets/glw-base.cpp @@ -54,10 +54,13 @@ void GLW_Base::paintEvent(QPaintEvent *ev){ if( !child[i]->isWidgetType() ){ continue; } //not a widget GLW_Widget *glww = qobject_cast<GLW_Widget*>(child[i]); if(glww!=0){ - if(ev->rect().contains(glww->widgetRect())){ + if(!ev->rect().intersected(glww->widgetRect()).isNull()){ glww->paintYourself(&painter, ev); glww->paintChildren(&painter,ev); } - } + }/*else{ + QWidget *widg = qobject_cast<QWidget*>(child[i]); + widg->render(&painter, widg->geometry().topLeft()); + }*/ } } diff --git a/src-qt5/src-glwidgets/glw-widget.cpp b/src-qt5/src-glwidgets/glw-widget.cpp index e24d8166..d07c0431 100644 --- a/src-qt5/src-glwidgets/glw-widget.cpp +++ b/src-qt5/src-glwidgets/glw-widget.cpp @@ -11,6 +11,8 @@ GLW_Widget::GLW_Widget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f){ glw_base = 0; this->setMouseTracking(true); + draggable = false; + drag_offset = QPoint(); } GLW_Widget::~GLW_Widget(){ @@ -25,7 +27,7 @@ QRect GLW_Widget::widgetRect(){ bool GLW_Widget::mouseOverWidget(){ QPoint pos = this->mapFromGlobal(QCursor::pos()); QRect geom(QPoint(0,0), this->size()); - return geom.contains(pos); + return geom.contains(pos) || (draggable && !drag_offset.isNull()); } @@ -39,7 +41,9 @@ void GLW_Widget::paintYourself(QStylePainter *painter, QPaintEvent *ev){ QRect rect = widgetRect(); rect = rect.intersected(ev->rect()); QColor color( mouseOverWidget() ? Qt::gray : Qt::yellow); - color.setAlpha(125); + //if(this->windowOpacity()!=1.0){ qDebug() << "Opacity:" << this->windowOpacity(); } + //color.setAlpha( qRound(this->windowOpacity()*255) ); + color.setAlpha( 125); painter->fillRect(rect, color); } @@ -59,6 +63,34 @@ void GLW_Widget::paintChildren(QStylePainter *painter, QPaintEvent *ev){ // --- PROTECTED --- +void GLW_Widget::mousePressEvent(QMouseEvent *ev){ + if(!draggable){ QWidget::mousePressEvent(ev); return; } + if(ev->button()==Qt::LeftButton){ + drag_offset = ev->pos(); + } +} + +void GLW_Widget::mouseReleaseEvent(QMouseEvent *ev){ + if(!draggable){ QWidget::mouseReleaseEvent(ev); return; } + if(ev->button()==Qt::LeftButton){ + if(drag_offset!=ev->pos()){ emit doneDragging(); } + drag_offset = QPoint(); } //reset offset +} + +void GLW_Widget::mouseMoveEvent(QMouseEvent *ev){ + if(!draggable){ QWidget::mouseMoveEvent(ev); return; } + if(!drag_offset.isNull()){ + this->move( this->mapTo(glw_base, ev->pos()-drag_offset) ); + } +} + + +void GLW_Widget::moveEvent(QMoveEvent *ev){ + QRect oldgeom = QRect(ev->oldPos(), this->size()); + QRect newgeom = QRect(ev->pos(), this->size()); + emit repaintArea( oldgeom.united(newgeom) ); +} + void GLW_Widget::resizeEvent(QResizeEvent *ev){ if(glw_base==0){ return; } QPoint pos = this->mapTo(glw_base, QPoint(0,0)); diff --git a/src-qt5/src-glwidgets/glw-widget.h b/src-qt5/src-glwidgets/glw-widget.h index 1d6caa77..91a1ae69 100644 --- a/src-qt5/src-glwidgets/glw-widget.h +++ b/src-qt5/src-glwidgets/glw-widget.h @@ -19,6 +19,8 @@ class GLW_Widget : public QWidget{ Q_OBJECT private: GLW_Base *glw_base; + QPoint drag_offset; + bool draggable; public: GLW_Widget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); @@ -32,18 +34,29 @@ public: virtual void paintYourself(QStylePainter *painter, QPaintEvent *ev); void paintChildren(QStylePainter *painter, QPaintEvent *ev); + //Properties + bool isDraggable(){ return draggable; } + private slots: public slots: + void setDraggable(bool drag){ draggable = drag; } + protected: - void enterEvent(QEvent*){ this->update(); } - void leaveEvent(QEvent*){ this->update(); } - void resizeEvent(QResizeEvent *ev); - void paintEvent(QPaintEvent *ev); + virtual void enterEvent(QEvent*){ this->update(); } + virtual void leaveEvent(QEvent*){ this->update(); } + + virtual void mousePressEvent(QMouseEvent *ev); + virtual void mouseReleaseEvent(QMouseEvent *ev); + virtual void mouseMoveEvent(QMouseEvent *ev); + virtual void moveEvent(QMoveEvent *ev); + virtual void resizeEvent(QResizeEvent *ev); + virtual void paintEvent(QPaintEvent *ev); signals: void repaintArea(QRect); + void doneDragging(); }; Q_DECLARE_INTERFACE(GLW_Widget, "GLW_Widget"); |