2010-12-02 5 views
6

QWidget에서 mouseEnter 및 mouseLeave 이벤트를 구현하는 방법은 무엇입니까? QWidget에서 mouseEnter 및 mouseLeave 이벤트를 구현하는 방법은 무엇입니까?

는 QWidget에 mouseEnter 그때 내가는 QWidget에서하는 MouseLeave 그때 내가 배경색을 설정해야하는 경우 회색, 에 배경 색상을 설정해야하는 경우

내가

void enterEvent(QEvent *); 
void leaveEvent(QEvent *); 
을 시도

백색

내부에 입력 & 이벤트를 남겨주세요. bool varibale set true를 사용하고 있습니다. & false. 나는 QPainter 이벤트 update()를 호출하고있다. 아래

코드 : 내가는 QWidget

QPainter::begin: Paint device returned engine == 0, type: 3 
QPainter::setRenderHint: Painter must be active to set rendering hints 
QPainter::end: Painter not active, aborted 

에 마우스를 이동하고 때 나는 다음과 같은 오류를 얻고있다

void Test::enterEvent(QEvent *) 
{ 
    _mouseMove=true; 
    update(); 

} 

void Test::leaveEvent(QEvent *) 
{ 
    _mouseMove=false; 
    update(); 

} 

void Test::paintEvent(QPaintEvent *) 
{ 
    QPainter painter; 
    painter.begin(&m_targetImage); 
    painter.setRenderHint(QPainter::Antialiasing); 

     if(_mouseMove){ 
      painter.fillRect(QRect(0,0,width(),height()),Qt::white);} 
     else{ 
      painter.fillRect(QRect(0,0,width(),height()),Qt::gray);} 

    painter.end(); 

    QPainter p; 
    p.begin(this); 
    p.drawImage(0, 0, m_targetImage); 
    p.end(); 
} 

이 문제를 해결하기 위해 도와주세요. 만약 샘플 코드를 가지고있는 사람이 있다면 ....

+0

또한 듣고 수를 업데이트() 자체를 수행하는 호버 (hover) 이벤트. Qt 스타일 시트는 또한 호버 상태에 따라 다른 설정을 허용합니다. –

답변

2

먼저 멤버를 사용하여 부울 대신 현재 배경색을 저장합니다. 첫 번째 QPainter가 나타납니다 내가 오류를 추측

painter.fillRect(QRect(...), m_backColor); 

:이 paintEvent 코드를 단순화합니다. QPainter를 사용하여 이미지를 채우는 이유는 무엇입니까? var가 QImage 인 경우 fill function을 예제로 사용하고 drawImage를 호출 할 수 있습니다. QPixmap에 대해 동일한 종류의 기능이 있습니다.

4

styles을 사용하십시오.

대부분의 위젯 :hover 의사 상태를 지원, 스타일

test->setStyleSheet(":hover {background-color: #dddddd;}"); 

에서 위젯의의 backgroundColor 속성을 설정하거나 당신이 그것을 할 사용자 정의 드로잉을 할 필요가 있다면, 더욱 편리 디자이너를 통해 그것을 할 . 하지만 기본 위젯 모양을 변경하는 모든 작업을 수행 할 필요는 없습니다.

0

다른 방법 : QStyleOption을 사용하십시오.

QStyleOption sopt; 
sopt.initFrom(this); 
if(sopt.state & QStyle::State_MouseOver) 
{ 
    painter.fillRect(QRect(...), m_colorHover); 
} 
else 
{ 
    painter.fillRect(QRect(...), m_colorNotHover); 
} 

또한 StyleOption 대신에 사용될 수 underMouse 방법을 지원 또는 솔루션 속성 _mouseMove

2

QWidgets처럼 사용 추가 변수가 필요하지 않습니다 :

if(underMouse()){ 
    painter.fillRect(QRect(0,0,width(),height()),Qt::white);} 
else{ 
    painter.fillRect(QRect(0,0,width(),height()),Qt::gray);} 
관련 문제