Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.8.0 - Qt Creator : 4.2.2 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4-Linux] QToolTip & mouseMoveEvent = bug ?

Bonjour,

j'écris ici la traduction francaise d'un mail que j'ai envoyé au support de trolltech :

Je suis donc sous linux avec qt 4.3.2.

J'ai des problemes avec le QToolTip, il disparait quand j'arrete de bouger la souris

j'ai reproduis un exemple de mon probleme en utilisant le rubberband et le toolTip avec mousePressEvent, mouseMoveEvent et mouseReleaseEvent, pour suivre la position de la souris.

Quand mon widget principale (C_window ) a un contructeur simple qui cree seulement le rubberband je n'ai pas de probleme
Quand je construit un layout special pour le widget j'ai un comportement etrange.

Dans le but de comprendre ce qu'il se passait pendant que je bougeais la souris j'ai surcharger la fonction event

Quand mon rubberband est sur 2 widget enfants, j'ai un comportement normale, comme avec le constructeur simple , et j'ai la series d'event suivante qui se reproduit :
QEvent::MouseMove ( 5 )
QEvent::Paint ( 12 )
QEvent::UpdateRequest ( 77 )

Quand le rubberband est sur un seul widget enfant j'ai la serie d'event suivante qui se reproduit :
QEvent::MouseMove ( 5 )
QEvent::UpdateRequest ( 77 )
QEvent::Leave ( 11 )
QEvent::Enter ( 10 )

Fais-je quelque chose d'anormale ou y aurait il un bug ?

Merci a vous
#include <QtGui>

class C_window : public QWidget
{
private :
QPoint origin ;
QRubberBand *rubberband ;

public :

C_window(){
//*
{//this code generates anormal disappearance of the QToolTip
QVBoxLayout *layout ;
QFrame *aFrame ;

layout = new QVBoxLayout ;

aFrame = new QFrame ;
aFrame->setFrameStyle( QFrame::Box | QFrame::Plain ) ;
aFrame->setAutoFillBackground( true ) ;
aFrame->setPalette( QPalette( Qt::red ) ) ;

layout->addWidget( aFrame ) ;

aFrame = new QFrame ;
aFrame->setFrameStyle( QFrame::Box | QFrame::Plain ) ;
aFrame->setAutoFillBackground( true ) ;
aFrame->setPalette( QPalette( Qt::blue ) ) ;

layout->addWidget( aFrame ) ;

this->setLayout( layout ) ;
this->resize( 640, 400 ) ;
}
//*/

this->rubberband = new QRubberBand( QRubberBand::Rectangle, this ) ;
}

~C_window(){
delete this->rubberband ;
}

protected :

virtual bool event( QEvent *ev ){
qDebug() << ev->type() ;
return QWidget::event( ev ) ;
}

virtual void mousePressEvent( QMouseEvent *ev ){
this->origin = ev->pos() ;
this->rubberband->setGeometry( QRect( this->origin, QSize() ) ) ;
this->rubberband->show() ;

QToolTip::showText( QCursor::pos(), this->get_info( ev->pos() ) ) ;
}

virtual void mouseMoveEvent( QMouseEvent *ev ){
if ( ev->buttons() == Qt::LeftButton ){
QPoint position ;
position = ev->pos() ;
this->rubberband->setGeometry( QRect( this->origin, position ).normalized() ) ;

QToolTip::showText( QCursor::pos(), this->get_info( ev->pos() ) ) ;
}
}

virtual void mouseReleaseEvent( QMouseEvent * ) {
this->rubberband->hide() ;
}

QString get_info( QPoint point ){
QString info ;
info = "x=%0, y=%1" ;
return info.arg( point.x() ).arg( point.y() ) ;
}

} ;

int main( int argc, char *argv[] )
{
QApplication app(argc, argv) ;
C_window window ;
window.show();
return app.exec();
}

Réponses

  • December 2007 modifié
    essaye:
    void C_window::mouseMoveEvent( QMouseEvent * ev )
    {
    if ( ev->buttons() == Qt::LeftButton )
    {
    QPoint position = ev->pos() ;
    rubberband->setGeometry(
    qMin( origin.x(), position.x() ),
    qMin( origin.y(), position.y() ),
    abs( position.x() - origin.x() ),
    abs( position.y() - origin.y() ) );
    QToolTip::showText( QCursor::pos(), get_info( ev->pos() ), this );
    }
    }
    ou encore
    void C_window::mouseMoveEvent( QMouseEvent * ev )
    {
    if ( ev->buttons() == Qt::LeftButton )
    {
    QPoint position = ev->pos() ;
    rubberband->setGeometry( QRect( origin, position - QPoint( 1, 1 ) ).normalized() );
    QToolTip::showText( QCursor::pos(), get_info( ev->pos() ), this );
    }
    }
    tu peux aussi remarquer qu'avec ton code le tooltip disparait quand tu agrandis le rubberband, mais pas quand tu le rétrécis!
  • Salut,

    En effet, j'avais remarqué que quand je retrecissait le rubberband le toolTip ne disparaisait pas !

    Pour tester, j'ai mis place les 2 solutions. Et ca marche niquel !!!
    Je crois que je vais utiliser la 1er car elle permet de bien comprendre le QRect::normalized

    Passé la joie et l'émerveillement, je voudrais qu'en meme comprendre ce qui n'allait pas.
    Dans la doc il trace le rubberband comme je l'avais fais mais cela a l'air de générer des event etranges dans la boucle d'evenements !!

    Si tu a la réponse ca me permettrait de bien dormir ce soir ;)

    Merci beaucoup en tout cas !
  • je ne vois pas non plus très bien ce qui se passe:
    ma solution ne fonctionne pas parfaitement: différence de comportement selon le quadrant et la direction de déplacement de la souris

    ce qui m'avait donné cette idée, c'est le pb des intervalles: 3 arbres <-> 2 intervalles (voir doc Qt: QRect § coordonnées)

    remarque: l'exemple de la doc QRubberBand n'affiche pas de tooltip
  • Pour l'instant la solution marche tres bien je n'ai pas vu de chose etrange donc je valide !!

    Merci encore et domage que tu n'en sache pas plus que moi car cela veut dire que je ne vais pas bien dormir ;)

    PS :
    Pour ceux qui voudrais le savoir " abs " n'est effectivement pas une fonction de QT. Il faut utiliser " qAbs ".
Connectez-vous ou Inscrivez-vous pour répondre.