[Qt-interest] Ruler widget not repainting
william.crocker at analog.com
william.crocker at analog.com
Mon Mar 21 22:22:36 CET 2011
Anton Chernov wrote:
> Hi!
>
> Very nervous bug, try already hard for very long time - i am making a
> ruler widget with showing current cursor position feature and a
> offseted origin, just like the standard way. The problem is that the
> current mouse position guids are drawn only when the mouse is over the
> ruler widget and not when the button is over the widget that i want to
> "measure" with my ruler.
>
Is mouse tracking turned on for the measure widget.
Are you ordering update events for the ruler
widget whenever the mouse moves over the measure widget.
> At first this is my Ruler:
> class Ruler : public QWidget {
> Q_OBJECT
> ...
> public:
> void setCursorPos( const QPoint& cursorPos )
> {
> if( mCursorPos == cursorPos ) { return; }
> mCursorPos = cursorPos;
> update();
> }
>
> bool eventFilter( QObject* obj, QEvent* event )
> {
> if( event->type() == QEvent::MouseMove )
> {
> QMouseEvent* mevent = static_cast( event );
> QWidget* widget = qobject_cast( obj );
> if( widget ) { setCursorPos( mevent->pos() ); }
> /* handle mouse events further */
> return false;
> }
> return QWidget::eventFilter( obj, event );
> }
>
> protected:
> void mouseMoveEvent( QMouseEvent* event )
> {
> setCursorPos( event->pos() );
> if( !( event->buttons() | Qt::RightButton ) ) { return; }
> QDrag* drag = new QDrag( this );
> QMimeData* mimeData = new QMimeData;
> drag->setMimeData( mimeData );
> drag->start( Qt::MoveAction );
> }
>
> void paintEvent( QPaintEvent* )
> {
> ...
> /* mouse guids */ drawMouseGuid( &painter );
> }
>
> void drawMouseGuid( QPainter* painter )
> {
> QPoint start, end;
> switch( mOrientation )
> {
> case Horizontal: { start.rx() = mCursorPos.x(); start.ry() = 0;
> end.rx() = mCursorPos.x(); end.ry() = rect().height(); } break;
> case Vertical: { start.rx() = 0; start.ry() = mCursorPos.y();
> end.rx() = rect().width(); end.ry() = mCursorPos.y(); } break;
> }
> painter->save();
> QPen pen;
> pen.setStyle( Qt::DotLine ); pen.setColor( Qt::black );
> pen.setWidth( 1 ); painter->setPen( pen ); painter->setOpacity( 0.4 );
> painter->drawLine( start, end );
> painter->restore();
> }
>
> I have tried 2 ways:
>
> 1. in the widget that holds my ruler and my measurable area i
> implemented the mouseMoveEvent
> void Preview::mouseMoveEvent( QMouseEvent* event )
> {
> ui->hRuler->setCursorPos( ui->hRuler->mapFromGlobal( event->globalPos() ) );
> QWidget::mouseMoveEvent( event );
> }
>
> 2. installed on the widget that i want to measure a event filter
> ui->previewArea->installEventFilter( ui->hRuler );
>
> Neither off them worked. The positions of the cursor seem to be valid
> and updated, but the ruler widget itself is repainted only when the
> mouse is over it or by reactivating the application (alt+tab,
> alt+tab). Please help! :)
>
> PS: mouseTracking is enabled for all widgets.
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at qt.nokia.com
> http://lists.qt.nokia.com/mailman/listinfo/qt-interest
>
More information about the Qt-interest-old
mailing list