Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Qt: eventFilter не работает в windows. [РЕШЕНО]  (Прочитано 1572 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
    Суть такова: у меня есть окно приложения, унаследованное от QWidget. в этом окне лежит рамка QFrame. Мне необходимо рисовать в этой рамке средствами пэинтера. чтобы не наследовать свой класс рамки и не переопределять в нем метод paintEvent решил использовать фильтр событий (заодно и выучить что оно такое). для этого в рамке устанавливаю фильтр события ui->myFrame->installEventFilter(this) далее в классе главного окна перегружаю функцию eventFilter, где и происходит рисование на рамке.

    Так дело вот в чем: в линуксе все отрабатывается и рисуется, а винде не работет. То есть все компилируется и запускается, но как только генерируется событие painEvent для рамки, то приложение вылетает с сообщением "Программа неожиданно завершилась. myProgramm.exe завершился с кодом -1073741819"

    Кто-нибудь сталкивался с таким поведением фильтра событий в виндовсе? помогите решить проблему. Если нужно будет выложить проект - выложу)
« Последнее редактирование: 28 Март 2012, 12:15:42 от FluffyMan »

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Qt: eventFilter не работает в windows.
« Ответ #1 : 27 Март 2012, 21:36:58 »
Вы вызываете painEvent в eventFilter?
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Qt: eventFilter не работает в windows.
« Ответ #2 : 27 Март 2012, 22:31:27 »
Вы имеете в виду myFrame->update(); ? нет. Вот листинг фильтра:

bool Widget::eventFilter(QObject *targer, QEvent *ev)
{
    if (targer == ui->frameScene)
    {
        if (ev->type() == QEvent::Paint)
        {
            if (painterState == false)
            {
                painter.begin(ui->frameScene);
                painterState = true;
            }
            drawScene();
        }
    }
    return false;
}

прошу прощения, рисую я не на метке, а на фрэйме. исправил везде в теме. но не суть важна (хотя может и в этом дело?)

и в процедуре drawScene() тоже не вызываю paintEvent для фрэйма своего.
« Последнее редактирование: 27 Март 2012, 22:41:44 от FluffyMan »

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Qt: eventFilter не работает в windows.
« Ответ #3 : 27 Март 2012, 22:58:19 »
ХЗ.
У меня в винде постоянно проблемы...

painter.end()?
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Qt: eventFilter не работает в windows.
« Ответ #4 : 27 Март 2012, 23:19:49 »
Завтра попробую — отпишусь.

Если не выйдет, выложу проект, попробуете скомпилить у себя? Может это у меня винда умирает.

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Qt: eventFilter не работает в windows.
« Ответ #5 : 27 Март 2012, 23:49:56 »
Ок.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Qt: eventFilter не работает в windows.
« Ответ #6 : 28 Март 2012, 12:14:07 »
Цитировать
ХЗ.
У меня в винде постоянно проблемы...

painter.end()?

Вы правы. необходимо закрывать контекст рисования. непонятно только почему под линуксом этого делать необязательно. надо взять за правило закрывать контекст рисования после самого рисования)

вот в таком виде работает под виндой:

bool Widget::eventFilter(QObject *targer, QEvent *ev)
{
    if (targer == ui->frameScene)
    {
        if (ev->type() == QEvent::Paint)
        {
            painter.begin(ui->frameScene);
            drawScene();
            painter.end();
        }
    }
    return false;
}

Спасибо!

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Qt: eventFilter не работает в windows. [РЕШЕНО]
« Ответ #7 : 09 Апрель 2012, 14:28:33 »
Закрыто.

 

Страница сгенерирована за 0.083 секунд. Запросов: 25.