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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: рисование на виджетах  (Прочитано 6678 раз)
Anton
Гость
« : Март 24, 2006, 19:17 »

Использую QT41, интегратор в VS2003. Создаю главное окно приложения, там рисуется то, что хочу.
Код:

void window::paintEvent(QPaintEvent *pe)
{

QPainter paint(this);
    paint.setPen(Qt::blue);
    paint.drawText(rect(), Qt::AlignCenter, "The Text");

}

вместо this подставляю ui.label - не рисует
Допустим, я не хочу рисовать на всем окне, а в какой-то определеной области или на каком-то виджете на этом окне. Как это сделать?
Записан
ElderOrb
Гость
« Ответ #1 : Март 24, 2006, 20:55 »

Вариант 1: Смотреть в сторону виджэтных флагов, там вроде было что-то вроде paintOnScreen. Думаю если выставить его для того виджэта на котором ты думаешь рисовать - всё будет ок.
Вариант 2: Установить на тот виджэт на котором ты хочешь рисовать evntFilter через installEventFilter и отрисовку делать в методе eventFilter(QObject* o, QEvent* e) по ивенту QEvent::Paint
Этим вариантом пользуюсь я сам и всё ок.
Записан
Anton
Гость
« Ответ #2 : Март 24, 2006, 22:10 »

попробовал:
Код:

bool DrawEventCatcher::eventFilter(QObject *obj, QEvent *event)
        {
            if (event->type() == QEvent::Paint)
{
QPainter paint(this);
paint.setPen(Qt::blue);
paint.drawLine(0,0,100,100);
return true;
}
else
{
                // standard event processing
                return QObject::eventFilter(obj, event);
            }
}

ошибка:
Код:

error C2664: 'QPainter::QPainter(QPaintDevice *)' : cannot convert parameter 1 from 'DrawEventCatcher *const ' to 'QPaintDevice *'
Записан
ElderOrb
Гость
« Ответ #3 : Март 24, 2006, 23:53 »

DrawEventCatcher является виджэтом?..
Записан
Anton
Гость
« Ответ #4 : Март 25, 2006, 08:35 »

Код:
class DrawEventCatcher: public QObject
{
Q_OBJECT

protected:
bool eventFilter(QObject *obj,QEvent *event);
};


добавлено спустя 28 минут:

 
Код:
class DrawEventCatcher: public QObject
{
Q_OBJECT

protected:
bool eventFilter(QObject *obj,QEvent *event);
};
Записан
Steven_Orko
Гость
« Ответ #5 : Март 25, 2006, 13:36 »

Зашибись, посмотри сам, на чем ты пытаешься рисовать... На объекте, который перехватил событие, т.е. на фильтре событий? Вот и ошибка)))  Если ты точно знаешь, что установил фильтр для наследника QWidget, то надо использовать указатель obj, а не this.
Код:

bool DrawEventCatcher::eventFilter(QObject *obj, QEvent *event)
        {
            if (event->type() == QEvent::Paint)
            {
                QWidget* pWidget = dynamic_cast<QWidget*>(obj);
                //Можно еще таким образом написать верхнюю строчку
                //QWidget* pWidget = qobject_cast<QWidget*>(obj);
                //Но мне больше импонирует первый вариант
                if (NULL != pWidget)
                {
                    QPainter paint(this);
                    paint.setPen(Qt::blue);
                    paint.drawLine(0,0,100,100);
                   return true;
                } else return false;              
            }
         else
         {
                // standard event processing
                return QObject::eventFilter(obj, event);
            }
      }
Записан
Anton
Гость
« Ответ #6 : Март 25, 2006, 14:43 »

Небольшая поправка  - не QPainter paint(this); , а QPainter paint(pWidget);
и еще - работает только второй вариант, на первом прога вылетает с проблемой выделения памяти. Теперь не могу background color задать. Рисую на frame.
Вообще, допустим, мне нужно, чтобы отдельно было поле для рисования белого цвета. На чем лучше рисовать кроме как на основном окне?
Записан
Steven_Orko
Гость
« Ответ #7 : Март 26, 2006, 14:21 »

Цитата: "Anton"
Небольшая поправка  - не QPainter paint(this); , а QPainter paint(pWidget);
Ты прав, забыл там исправить ))))
Цитировать

и еще - работает только второй вариант, на первом прога вылетает с проблемой выделения памяти.
Тут, наверно, QT framework все-таки права, так только ей известно RTTI своих объектов, потому второй вариант предпочтительней )))
На остальное не отвечу, потому как не занимался еще этим. Просто увидел ошибку в коде ))))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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