Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Toha_r от Апрель 09, 2009, 17:14



Название: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: Toha_r от Апрель 09, 2009, 17:14
Добрый день всем!

Мне необходимо полностью перехватить отрисовку виджета, т.е. что бы он полностью рисовался на мой буфер. Частично это получилось.

Вывел свой класс из QTextEdit. Переопределил в нем функции event(...) и paintEvent(...) для того, что бы заглушить отрисовку виджета. В целом это получилось. Но бэкграунд виджета настырно продолжает рисоваться. Перерыл практически весь QT, но так и не нашел возможности его убрать.

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

header:
Код
C++ (Qt)
   class TextEditQT : public QTextEdit
   {
   public:
     TextEditQT(QWidget *parent);
 
   public:
     bool is_updated()
     {
       return _is_updated;
     }
 
     void setGrabStat(bool state)
     {
       _is_grab = state;
     }
 
     void setUpdateStat(bool state)
     {
       _is_updated = state;
     }
 
   protected:
     virtual bool event(QEvent *event);
     virtual void paintEvent(QPaintEvent * event);
 
   private:
     bool _is_updated,
          _is_grab;
   };
 

source:
Код
C++ (Qt)
   TextEditQT::TextEditQT(QWidget *parent)
     : QTextEdit(parent), _is_updated(false), _is_grab(false)
   {
     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 
     setAutoFillBackground(false);
 
     setAttribute(Qt::WA_StyledBackground, false);
     setAttribute(Qt::WA_OpaquePaintEvent);
     setAttribute(Qt::WA_NoSystemBackground);
     setAttribute(Qt::WA_PaintOnScreen);
   }
 
   bool
   TextEditQT::event(QEvent *event)
   {
     if (!_is_grab)
     {
       switch (event->type())
       {
       case QEvent::Paint:
       case QEvent::UpdateRequest:
         {
           _is_updated = true;
 
           event->accept();
 
           return true;
         }
         break;
       }
     }
 
     return QTextEdit::event(event);
   }
 
   void
   TextEditQT::paintEvent(QPaintEvent * event)
   {
     if (!_is_grab)
     {
       _is_updated = true;
 
       event->accept();
     }
     else
       QTextEdit::paintEvent(event);
   }
 


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: _OLEGator_ от Апрель 09, 2009, 19:21
Такое, на скорую руку:
Код
C++ (Qt)
   TextEditQT::TextEditQT(QWidget *parent): QTextEdit(parent), _is_updated(false), _is_grab(false)
   {
     QPalette p = palette();
     p.setColor(QPalette::Base, p.color(QPalette::Window));
     setPalette(p);
 
     setStyleSheet("border: 0px;");
 
     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 
     setAutoFillBackground(false);
 
     setAttribute(Qt::WA_StyledBackground, false);
     setAttribute(Qt::WA_OpaquePaintEvent);
     setAttribute(Qt::WA_NoSystemBackground);
     setAttribute(Qt::WA_PaintOnScreen);
   }
 


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: Toha_r от Апрель 10, 2009, 10:40
Не помогло.  >:(

Так же не помогает устанавливать бэкграунд в другой цвет (т.е. rgb(...) и rgba(...)). Виджет продолжает рисовать, в том месте где стоит, белым цветом (RGB(255,255,255)).


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: EhTemka от Апрель 10, 2009, 15:40
А если сделать его полностью прозрачным?

Код
C++ (Qt)
QWidget::setWindowOpacity(0);


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: SABROG от Апрель 11, 2009, 16:28
У QTextEdit есть viewport(), его эвенты тоже надо переопределять.


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: Toha_r от Апрель 15, 2009, 14:00
У QTextEdit есть viewport(), его эвенты тоже надо переопределять.

Переопределение viewportEvent(...) не помогло.

Если следующим образом:

Код
C++ (Qt)
MyWidget *mw = new MyWidget();
setViewport(mw);
 

То при выполнении валится на создании шрифтов, не создан контекст рисования.

Вот если бы можно было подсунуть свой контекст рисования QTextEdit-у, то это решило бы все проблемы. Но я так и не нашел способа это сделать.


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: pastor от Апрель 15, 2009, 14:05
А нелегче тогда использовать QTextDocument и его метод drawContents чтобы рисовать в свой буфер?


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: Toha_r от Апрель 15, 2009, 14:14
А нелегче тогда использовать QTextDocument и его метод drawContents чтобы рисовать в свой буфер?

У QTextDocument нету возможностей для редактирования, как у QTextEdit. И в доке написано что для редактирования использовать QTextEdit.


Название: Re: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?
Отправлено: pastor от Апрель 15, 2009, 14:22
Тогда, сорри. Задача не ясна