Russian Qt Forum
Ноябрь 23, 2024, 15:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Что всё-таки не так с paintEvent() после QWidget::update()?  (Прочитано 12319 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Январь 17, 2017, 14:38 »

В который раз столкнулся - класс наследует QWidget, в нём переопределён paintEvent(), и при вызове update() или repaint() он не вызывается. Всякий раз находил обходные пути - сейчас вместо QWidget унаследовал QLabel, у него при update вызывается paintEvent(). То есть, буквально поменял родительский класс - и заработало как надо. У QLabel есть лишний для меня функционал, да и чёрт с ним.

Но хотя бы для спортивного интереса любопытно - почему так? Ковырять для этого исходники некогда - может уже кто-то ковырял?
Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Январь 17, 2017, 14:40 »

QWidget в отличие от QFrame (->Qlabel) не определяет некоторые базовые методы связанные с размерами виджета

Полезный раздел в документации Пользовательские виджеты в компоновщиках, особенно место "Вызывайте QWidget::updateGeometry() всякий раз, когда ..."
« Последнее редактирование: Январь 17, 2017, 14:47 от lit-uriy » Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Январь 17, 2017, 14:46 »

QWidget в отличие от QFrame (->Qlabel) не определяет некоторые базовые методы связанные с размерами виджета

Странно... у виджета же есть geometry(), размеры заданы в дизайнере.

То есть, достаточно QFrame наследовать? Попробую... - да, действительно. При наследовании QFrame работает нормально.
Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Январь 17, 2017, 14:47 »

Обновил свой пост, прочитай пожалуйста
Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Январь 17, 2017, 14:59 »

Ну это там всё относится к компоновке, а не к рисованию - в моём случае пока не важно, автоматический компоновщик пока что не используется. Но всё равно может пригодиться, спс.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Январь 17, 2017, 15:42 »

Ну это там всё относится к компоновке, а не к рисованию - в моём случае пока не важно, автоматический компоновщик пока что не используется. Но всё равно может пригодиться, спс.
А вы можете компилируемый пример показать, где не вызывается paintEvent?
Никогда с таким не сталкивался, куча виджетов наследуется от QWidget и все нормально.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Январь 17, 2017, 16:08 »

А вы можете компилируемый пример показать, где не вызывается paintEvent?
Никогда с таким не сталкивался, куча виджетов наследуется от QWidget и все нормально.

Да не, для этого его создавать отдельно надо. На пальцах всё просто было:

Код:
class TLwidget : public QWidget
{
...
    void timeout();
...
protected:
    void paintEvent(QPaintEvent*);
...
};

void TLwidget::timeout()
{
...
    update();
    qDebug()<<"drawn";
}

void TLwidget::paintEvent(QPaintEvent*)
{
    QPainter p(this);
    p.fillRect( geometry(), QBrush(backcolor) );
    p.setPen( QPen(forecolor) );
    p.setFont(font);
    p.drawText( xpos, ypos, text );
}

Ну единственное, что это ещё и плагин дизайнера, с пропертями и всякой такой всячиной. Но это всё не существенно - при наследовании от QWidget текста и фона на виджете нет (в отладку печатает drawn), при наследовании от QFrame всё есть.
« Последнее редактирование: Январь 17, 2017, 16:10 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Январь 17, 2017, 16:33 »

А почему вы здесь используете geometry?
Код
C++ (Qt)
   p.fillRect( geometry(), QBrush(backcolor) );
 

Здесь должен быть rect(). Посмотрите что возвращает geometry().
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Январь 17, 2017, 16:34 »

А вот тестовый пример, где все работает:
Код
C++ (Qt)
#include "widget.h"
#include <QPainter>
#include <QTimer>
 
Widget::Widget( QWidget *parent ) :
QWidget( parent ),
tick( true ),
timer( new QTimer( this ) )
{
connect( timer, SIGNAL(timeout()), SLOT(timeout()) );
timer->setInterval( 1000 );
timer->setSingleShot( false );
timer->start();
}
 
void Widget::timeout()
{
tick = !tick;
update();
}
 
void Widget::paintEvent( QPaintEvent * )
{
QPainter p( this );
p.fillRect( rect(), QBrush( tick? Qt::blue : Qt::darkBlue ) );
p.setPen( QPen( Qt::yellow ) );
p.drawText( 20, 20, "Test string" );
}
 

Архив нужно приложить?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Январь 17, 2017, 16:52 »

А почему вы здесь используете geometry?
Код
C++ (Qt)
   p.fillRect( geometry(), QBrush(backcolor) );
 

Здесь должен быть rect(). Посмотрите что возвращает geometry().


Да не важно - paintEvent() вообще не вызывался. Там как раз был отладочный qDebug()<<geometry(); в начале, он не выводил ничего. То есть совсем ничего. Для QFrame там frameRect() сейчас.
« Последнее редактирование: Январь 17, 2017, 16:54 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Январь 17, 2017, 16:53 »

Архив нужно приложить?

Нет, не нужно. Я же говорю - поменял QWidget на QFrame и использовал frameRect() - всё заработало.

Мало ли... во-первых, это у меня кастомный плагин, во-вторых, этот виджет привязан к QWidgetItem, лежащему на графической сцене.


« Последнее редактирование: Январь 17, 2017, 16:56 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Январь 17, 2017, 16:55 »

Я же говорю - поменял QWidget на QFrame и использовал frameRect() - всё заработало.
А если сейчас обратно поменять на QWidget? Если не заработает, выкладывайте исходник этого виджета. Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Январь 17, 2017, 16:56 »

Я же говорю - поменял QWidget на QFrame и использовал frameRect() - всё заработало.
А если сейчас обратно поменять на QWidget? Если не заработает, выкладывайте исходник этого виджета. Улыбающийся

Не заработает. Ничего менять не буду - уже другим занят. Не пришлю. Proprietary.  Улыбающийся
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Январь 17, 2017, 17:22 »

Да, ещё, кстати забыл упомянуть - это всё происходит в Android. В дизайнере на десктопе под Linux этот виджет рисует только фон, текст почему-то вообще не появляется (некогда сейчас разбираться). Но с QWidget и в дизайнере даже фона не было.
Записан

2^7-1 == 127, задумайтесь...
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #14 : Январь 17, 2017, 17:40 »

Но хотя бы для спортивного интереса любопытно - почему так? Ковырять для этого исходники некогда - может уже кто-то ковырял?
А версия Qt какая?
На 473 и 421 не встречался с такими фокусами.
ПС. Обожаю виджеты самописки - много геморроя убирают...
« Последнее редактирование: Январь 17, 2017, 17:43 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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