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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прокси виджеты тормозят, как оптимизировать их отрисовку на сцене?  (Прочитано 4388 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Январь 12, 2012, 18:25 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Январь 12, 2012, 18:50 »

Но вот беда, мне нужно использовать стандартные QLabel, QProgressBar, QFrame. Есть их аналоги-наследники от QGraphicsWidget
или нужно все руками рисовать?
В перегруженном QGraphicsWidget::paint() используй QStyle::drawControl().
Записан

Qt 5.11/4.8.7 (X11/Win)
popper
Гость
« Ответ #2 : Январь 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
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Январь 13, 2012, 15:02 »

классические виджеты (наследники от QWidget) нельзя размещать в лейаутах QGraphicsWidget Грустный
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Январь 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);
}

Почему?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Январь 13, 2012, 15:36 »

а нет, вызывается, сорри.
Так что получается, придется руками переписывать QLabel, QProgressBar?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Январь 13, 2012, 18:26 »

А кто знает, какая альтернатива QSpacer для QGraphicsLinearLayout?
Мне нужно что бы виджет был "придавлен" к верху в лейауте. addStretch никакого эффекта не дает Грустный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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