Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Fregloin от Январь 12, 2012, 18:25



Название: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: Fregloin от Январь 12, 2012, 18:25
Привет. Нужно на сцене нарисовать шкафы с оборудованием (я уже поднимал эту темку ранее).
Рисую с помощью виджетов, а потом эти виджеты кидаю на сцену через прокси-виджет.
Сцена очень сильно тормозит. Читал, что нежелательно использовать QWidget, вместо их нужно использовать QGraphicsWidget.
Но вот беда, мне нужно использовать стандартные QLabel, QProgressBar, QFrame. Есть их аналоги-наследники от QGraphicsWidget
или нужно все руками рисовать?
Виджеты компоную кучей лейатуов в редакторе.


Название: Re: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: GreatSnake от Январь 12, 2012, 18:50
Но вот беда, мне нужно использовать стандартные QLabel, QProgressBar, QFrame. Есть их аналоги-наследники от QGraphicsWidget
или нужно все руками рисовать?
В перегруженном QGraphicsWidget::paint() используй QStyle::drawControl().


Название: Re: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: popper от Январь 12, 2012, 22:41
Из справки:

Unlike QGraphicsItem, QGraphicsWidget is not an abstract class; you can create instances of a QGraphicsWidget without having to subclass it. This approach is useful for widgets that only serve the purpose of organizing child widgets into a layout.

Я думаю, что достаточно создать необходимые виджеты, разместить их в лэйауте, который затем передать объекту QGraphicsWidget


Название: Re: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: Fregloin от Январь 13, 2012, 15:02
классические виджеты (наследники от QWidget) нельзя размещать в лейаутах QGraphicsWidget :(


Название: Re: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: Fregloin от Январь 13, 2012, 15:33
Пробую создать простую метку, но метод paint не вызывается при добавлении виджета на сцену

Код:
#include <QGraphicsWidget>
#include <QString>

class QGraphicsLabel : public QGraphicsWidget
{
    QString         ftext;
    Qt::Alignment   ftextAligment;
protected:
    void    changeEvent(QEvent *event);
    QRectF  boundingRect()    const;
    void    paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
public:
    QGraphicsLabel(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
    QString text() const;
    void    setText(QString Text);
    Qt::Alignment   textAligment() const;
    void    setTextAligment(Qt::Alignment TextAligment);
};

Код:
#include    <QPainter>
#include    "qgraphicslabel.h"

QGraphicsLabel::QGraphicsLabel(QGraphicsItem * parent, Qt::WindowFlags wFlags)
    :QGraphicsWidget(parent,wFlags)
{
    ftextAligment = Qt::AlignLeft|Qt::AlignVCenter;
}

QString QGraphicsLabel::text() const
{
    return  ftext;
}

void    QGraphicsLabel::setText(QString Text)
{
    if(ftext!=Text)
    {
        ftext = Text;
        QFontMetrics    metrics(font());
        QSize           _size = metrics.size(ftextAligment,ftext);
        resize(_size.width(),_size.height());
        update();
    }
}

Qt::Alignment   QGraphicsLabel::textAligment() const
{
    return  ftextAligment;
}

void    QGraphicsLabel::setTextAligment(Qt::Alignment TextAligment)
{
    if(ftextAligment!=TextAligment)
    {
        ftextAligment = TextAligment;
        update();
    }
}

void    QGraphicsLabel::changeEvent(QEvent *event)
{
    switch(event->type())
    {
    case    QEvent::Resize:
        break;
    case    QEvent::FontChange:
        update();
        break;
    default:
        return;
    }
}

QRectF  QGraphicsLabel::boundingRect()    const
{
    return  QRectF(0,0,size().width(),size().height());
}

void    QGraphicsLabel::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::white);
    painter->drawText(rect(),ftextAligment,ftext);
}

Почему?


Название: Re: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: Fregloin от Январь 13, 2012, 15:36
а нет, вызывается, сорри.
Так что получается, придется руками переписывать QLabel, QProgressBar?


Название: Re: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?
Отправлено: Fregloin от Январь 13, 2012, 18:26
А кто знает, какая альтернатива QSpacer для QGraphicsLinearLayout?
Мне нужно что бы виджет был "придавлен" к верху в лейауте. addStretch никакого эффекта не дает :(