Как реализовать MouseEnter и MouseLeave событие в QWidget? - PullRequest
6 голосов
/ 02 декабря 2010

как реализовать события mouseEnter и mouseLeave в QWidget?

если mouseEnter для QWidget, тогда мне нужно установить цвет фона в серый, если mouseLeave из QWidget, то мне нужно установить цвет фонабелый

я пробовал

void enterEvent(QEvent *);
void leaveEvent(QEvent *);

внутри события входа и выхода. Я использую bool varibale set true и false.и я вызываю событие QPainter update ();

с кодом ниже:

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();
}

я получаю следующую ошибку при перемещении мыши в 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

Пожалуйста, помогите мне исправить это.если есть пример кода, пожалуйста, предоставьте мне ....

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

Используйте стили .

Большинство виджетов поддерживают псевдо-состояние :hover, задайте свойство backgroundcolor для вашего виджета в стиле

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

или сделайте это через дизайнер, что еще удобнее, если вам нужносделать собственный рисунок сделать это.но вам не нужно делать это для всего, что просто меняет базовый вид виджета.

3 голосов
/ 17 декабря 2014

QWidgets также поддерживает метод underMouse, который можно использовать вместо решения StyleOption или Attribute:

if(underMouse()){
    painter.fillRect(QRect(0,0,width(),height()),Qt::white);}
else{
    painter.fillRect(QRect(0,0,width(),height()),Qt::gray);}
2 голосов
/ 02 декабря 2010

Сначала я бы использовал элемент для сохранения текущего цвета фона вместо логического. Это упростит код paintEvent:

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

Полагаю, ошибки появляются для первого QPainter. Почему вы используете QPainter, чтобы заполнить изображение? Если var является QImage, вы можете использовать функцию заполнения в качестве примера и вызывать drawImage, как и вы. У вас есть такая же функция для QPixmap .

0 голосов
/ 12 февраля 2014

Другой способ: использовать QStyleOption.

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

Не нужно использовать дополнительную переменную, например _mouseMove

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...