crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> проблема с рисованием
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2009, 2:40
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Да, что-то оно ни вкакую не рисуется. Я уже два класса сделал из одного в другой событие шлю.

Заметил:
Первый раз отправленное событие отрабатывает нормально, но все последующие разы событие paintEvent происходит, но QPainter ругается:
Цитата
QPainter::begin: Widget painting can only begin as a result of a paintEvent


Такое ощущение, как будто чего-то не доделываю до конца.
Исходники: Прикрепленный файл  test.zip ( 1.7 килобайт ) Кол-во скачиваний: 194
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.5.2009, 11:32
Сообщение #12


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy @ 22.5.2009, 3:40) *
событие paintEvent происходит, но QPainter ругается
Пытался разобраться в данном вопросе. Не смог :(

При вызове paintEvent через postEvent, paint.paintEngine() возвращает 0.
Данное поведение сокрыто где-то здесь
Раскрывающийся текст
    // We know for sure that redirection is broken when the widget is inside
    // its paint event, so it's safe to use our hard-coded redirection. However,
    // there IS one particular case we still need to support, and that's
    // when people call QPainter::setRedirected in the widget's paint event right
    // before any painter is created (or QPainter::begin is called). In that
    // particular case our hard-coded redirection is restored and the redirection
    // is retrieved from QPainter::redirected (as before).
    if (pd->devType() == QInternal::Widget)
        rpd = static_cast<QWidget *>(pd)->d_func()->redirected(&redirectionOffset);

    if (!rpd)
        rpd = redirected(pd, &redirectionOffset);

    if (rpd)
        pd = rpd;

#ifdef QT_DEBUG_DRAW
    if (qt_show_painter_debug_output)
        printf("QPainter::begin(), device=%p, type=%d\n", pd, pd->devType());
#endif


    d->device = pd;
...
...
    d->engine = pd->paintEngine();
...
...
    if (!d->engine) {
        qWarning("QPainter::begin: Paint device returned engine == 0, type: %d", pd->devType());
        return true;
    }


Еще пробовал разобраться, как работает метод update(). В нем событие высылается так:
Раскрывающийся текст
 void QWidget::update(const QRect &rect)
{
    if (!isVisible() || !updatesEnabled() || rect.isEmpty())
        return;

    if (testAttribute(Qt::WA_WState_InPaintEvent)) {
        QApplication::postEvent(this, new QUpdateLaterEvent(rect));
        return;
    }

    if (hasBackingStoreSupport()) {
        QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
        if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
            tlwExtra->backingStore->markDirty(rect, this);
    } else {
        d_func()->repaint_sys(rect);
    }
}

QUpdateLaterEvent для нас недоступен. Реализаций метода repaint_sys и класса QWidgetBackingStore не смог даже найти, ни раками, ни через поиск.

Как-то все слишком сложно для меня оказалось.
Да и нужно ли в этом разбираться? Все равно так делать никто ни будет. Есть ведь метод update.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2009, 12:10
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 22.5.2009, 15:32) *
Все равно так делать никто ни будет. Есть ведь метод update.
да просто интересно, если можно посылать событие типа QEvent::Paint, то как, где и когда?

Цитата(igor_bogomolov @ 22.5.2009, 15:32) *
Реализаций метода repaint_sys
это поидее в приватной части (QWidgetPrivate), на которую d-указатель ссылается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.5.2009, 12:17
Сообщение #14


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy @ 22.5.2009, 13:10) *
да просто интересно
Конечно интересно. Поэтому и пробовал разобраться :)

Цитата(Litkevich Yuriy @ 22.5.2009, 13:10) *
это поидее в приватной части (QWidgetPrivate), на которую d-указатель ссылается.
Это я понимаю. Объявление функции в классе есть (в QWidgetPrivate). Реализации я найти не смог. Посмотри исходники. Если найдешь, скажи пожалуйста где. Я не нашел, и поисковик ничего не дал.

Сообщение отредактировал igor_bogomolov - 22.5.2009, 12:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 3.6.2009, 0:07
Сообщение #15


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Не совсем по теме, но вот эта вещь, narik1985, имхо бесмысленна:
#ifdef SK
#define SK


нужно либо #ifndef (#if !defined), либо потом не #define, a #undef и потом #define.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.6.2009, 9:12
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ну да, перепутал человек.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.2.2025, 7:02