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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QT 4.5.0] Перехват отрисовки у виджета - как заглушить всю отрисовку?  (Прочитано 5622 раз)
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);
   }
 
« Последнее редактирование: Апрель 09, 2009, 17:43 от Toha_r » Записан
_OLEGator_
Гость
« Ответ #1 : Апрель 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);
   }
 
Записан
Toha_r
Гость
« Ответ #2 : Апрель 10, 2009, 10:40 »

Не помогло.  Злой

Так же не помогает устанавливать бэкграунд в другой цвет (т.е. rgb(...) и rgba(...)). Виджет продолжает рисовать, в том месте где стоит, белым цветом (RGB(255,255,255)).
Записан
EhTemka
Гость
« Ответ #3 : Апрель 10, 2009, 15:40 »

А если сделать его полностью прозрачным?

Код
C++ (Qt)
QWidget::setWindowOpacity(0);
Записан
SABROG
Гость
« Ответ #4 : Апрель 11, 2009, 16:28 »

У QTextEdit есть viewport(), его эвенты тоже надо переопределять.
Записан
Toha_r
Гость
« Ответ #5 : Апрель 15, 2009, 14:00 »

У QTextEdit есть viewport(), его эвенты тоже надо переопределять.

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

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

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

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

Вот если бы можно было подсунуть свой контекст рисования QTextEdit-у, то это решило бы все проблемы. Но я так и не нашел способа это сделать.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Апрель 15, 2009, 14:05 »

А нелегче тогда использовать QTextDocument и его метод drawContents чтобы рисовать в свой буфер?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Toha_r
Гость
« Ответ #7 : Апрель 15, 2009, 14:14 »

А нелегче тогда использовать QTextDocument и его метод drawContents чтобы рисовать в свой буфер?

У QTextDocument нету возможностей для редактирования, как у QTextEdit. И в доке написано что для редактирования использовать QTextEdit.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Апрель 15, 2009, 14:22 »

Тогда, сорри. Задача не ясна
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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