Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Anton от Март 24, 2006, 19:17



Название: рисование на виджетах
Отправлено: 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 от Март 24, 2006, 20:55
Вариант 1: Смотреть в сторону виджэтных флагов, там вроде было что-то вроде paintOnScreen. Думаю если выставить его для того виджэта на котором ты думаешь рисовать - всё будет ок.
Вариант 2: Установить на тот виджэт на котором ты хочешь рисовать evntFilter через installEventFilter и отрисовку делать в методе eventFilter(QObject* o, QEvent* e) по ивенту QEvent::Paint
Этим вариантом пользуюсь я сам и всё ок.


Название: рисование на виджетах
Отправлено: Anton от Март 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 от Март 24, 2006, 23:53
DrawEventCatcher является виджэтом?..


Название: рисование на виджетах
Отправлено: Anton от Март 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 от Март 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 от Март 25, 2006, 14:43
Небольшая поправка  - не QPainter paint(this); , а QPainter paint(pWidget);
и еще - работает только второй вариант, на первом прога вылетает с проблемой выделения памяти. Теперь не могу background color задать. Рисую на frame.
Вообще, допустим, мне нужно, чтобы отдельно было поле для рисования белого цвета. На чем лучше рисовать кроме как на основном окне?


Название: рисование на виджетах
Отправлено: Steven_Orko от Март 26, 2006, 14:21
Цитата: "Anton"
Небольшая поправка  - не QPainter paint(this); , а QPainter paint(pWidget);
Ты прав, забыл там исправить ))))
Цитировать

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