ツールチップ上でマウス カーソルを移動しても、PySide で mouseMoveEvent が返されないように見えることに気付きました。
私の場合、マウスがメイン アイコン領域を移動するとメイン アイコンの上にミニ アイコンが動的に表示され、マウスがメイン アイコン領域を離れるとミニ アイコンが再び非表示になるため、問題が発生します。そのため、ユーザーが大きなツールチップ上でマウス カーソルを移動し、メイン ボタン領域の外に出た場合、マウス イベントは新しい位置を登録せず、マウスがメイン アイコン領域から離れても、ミニ アイコンは表示されたままになります。 .
カスタム QToolTip を作成し、それをメイン ボタン領域から離して配置することで、この問題を回避できると思います。そのため、ツールチップを介してメイン ボタン領域を離れることはできません。しかし、それは醜いようです。
ツールチップを mouseMoveEvent に登録して回避できるようにする方法を知っている人はいますか?
以下はスニペットの例です (正しくフォーマットされることを願っています。これまでここに投稿したことはありません)。
import sys
from PySide.QtGui import *
from PySide.QtCore import *
class FancyButtonSmall( QWidget ):
def __init__( self, parent=None ):
super( FancyButtonSmall, self ).__init__( parent )
self.setMouseTracking( True ) # TO DISPLAY "REMOVE" ICON ON MOUSE OVER
# LAYOUT
layout = QVBoxLayout()
layout.setSpacing( 0 )
self.setLayout( layout )
self.setSizePolicy( QSizePolicy.Fixed, QSizePolicy.Fixed )
self.fixedSize = ( 80, 80 )
# BUTTON AND MOUSE STATE
self.mainButtonDown = False # TO DRAW ICON STATE PROPERLY
self.removeButtonDown = False # TO DRAW ICON STATE PROPERLY
self.mouseOver = False # TO DISPLAY DELETE ICON
# BUTTON COLOURS
self.widgetColMainUp = QColor(60, 60, 60, 0)
# LABELS
self.textCol = QColor( 150, 150, 150 )
# TOOLTIP
self.setToolTip( self.__wrapText( 100*'test ' ) )
def __wrapText( self, text, maxChar = 50 ):
'''wrap text to only contain maxChar per line'''
i = 1
charList = list( text )
while i*maxChar < len( charList ):
charList.insert( i*maxChar, '\n' )
i += 1
return ''.join( charList )
def mouseMoveEvent( self, event ):
'''Show remove icon if cursor is on top of main icon'''
print event.pos()
self.mouseOver = self.iconRect.contains( event.pos() ) or self.removeIconRect.contains( event.pos() )
self.update()
def paintEvent( self, event ):
painter = QPainter( self )
painter.setRenderHint( QPainter.Antialiasing )
# ICONS
self.mainRect = QRect( 0, 0, self.geometry().width(), self.geometry().height() )
iconSize = QSize( 58,58 )
iconPos = QPoint( ( self.mainRect.width()-iconSize.width())/2, 10 )
self.iconRect = QRect( iconPos, iconSize)
removeIconSize = QSize( 16, 16 )
removeIconPos = QPoint( iconSize.width()+iconPos.x()-10, iconPos.y()-5 )
self.removeIconRect = QRect( removeIconPos, removeIconSize )
# DRAW ICONS
self.drawIcon( painter, iconPos, iconSize )
# DRAW REMOVE ICON
if self.mouseOver:
self.drawIcon( painter, removeIconPos, removeIconSize, 'remove' )
def drawIcon( self, painter, pos, size, btn='main' ):
'''Draw icon with status'''
painter.drawRect( pos.x(), pos.y(), size.width(), size.height() )
def minimumSizeHint( self ):
return QSize( *self.fixedSize )
def sizeHint( self ):
return QSize( *self.fixedSize )
if __name__ == '__main__':
import os
app = QApplication( sys.argv )
w = QWidget()
w.setLayout( QGridLayout() )
btn2 = FancyButtonSmall()
w.layout().addWidget( btn2, 1, 0 )
w.show()
sys.exit( app.exec_() )