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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: В чём смысл size в ф-ии QGraphicsItem::setCacheMode и как увеличить качество  (Прочитано 2641 раз)
Sasha
Гость
« : Январь 28, 2014, 17:26 »

Здравствуйте,
В функции QGraphicsItem::setCacheMode последним параметром идёт logicalCacheSize, применяемый только в режиме ItemCoordinateCache. Так вот, несмотря на советскую власть то, что у меня есть описание этой ф-ии на русском, всё-равно не понятно зачем он нужен, ибо я думал, что он служит для увеличени/уменьшения качества закэшированного изображения и, исходя из этого передавал в ф-ю размер в 2 раза больший размера моего элемента, но вместо просто увеличенного качества, получал увеличенный в 2 раза элемент.
Т.е. вопрос - как увеличить качество кэшированного изображения?

Ещё более подробное описание проблеммы:
1) у меня есть сложный элемент 100x100 с текстом и прочими деталями.
2) На экран я его вывожу в 2 раза большего размера, применяя масштабирования, т.е размером 200x200.
2.1) Без кэширования, например, фонт увеличивается в 2 раза не теряя чёткости.
2.2) С кэшированием, например, фонт увеличивается в 2 раза ТЕРЯЯ чёткость, просто каждый пиксель сглаженно или не сглаженно, но растягивается в 2 раза
2.3) С кэшированием, НО передав в ф-ю размер 200x200 получаю на экране изображение уже 400x400, т.е. произошло вначале отображение моего элемента на размер 200x200, а потом уже к этому кэшу применилось моё увеличение в 2 раза. И здесь уже не до фонтов, т.к. не понятно что делать с размером.
Записан
_OLEGator_
Гость
« Ответ #1 : Январь 28, 2014, 21:31 »

Показывай как выводишь элемент в 2 раза увеличенный.
На вскидку, надо отказаться от непонятного увеличения элемента в 2 раза и просто рисовать сразу элемент нужного размера.
Записан
Sasha
Гость
« Ответ #2 : Февраль 03, 2014, 11:36 »

Показывай как выводишь элемент в 2 раза увеличенный.
На вскидку, надо отказаться от непонятного увеличения элемента в 2 раза и просто рисовать сразу элемент нужного размера.
Показываю. Только это не чистый тест графических объектов. Это код, который заменяет всю центральную часть произвольного наследника от QMainWindow, на графичекскую + масштабирует преобразованную центральную часть в зависимости от размеров всего окна. И в нём есть проблемма с этим самым кэшем:
Код
C++ (Qt)
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QtGui>
 
int g_cxWorld = 640;
int g_cyWorld = 480;
 
/*****************************************************************************/
class GraphicsView : public QGraphicsView
{
   QGraphicsWidget *m_pgw;
   int m_cxWorld, m_cyWorld;
public:
   GraphicsView(QGraphicsScene *scene, int cxWorld=800, int cyWorld=600, QWidget *parent = 0) : QGraphicsView(scene,parent)
   {
       m_cxWorld = cxWorld;
       m_cyWorld = cyWorld;
       setAlignment( Qt::AlignLeft | Qt::AlignTop );
       setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
       setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
       setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing );// | QPainter::HighQualityAntialiasing | QPainter::NonCosmeticDefaultPen);
   }
 
   void SaveCurMainWidget( )
   {
       int n = scene()->items().size();
       QGraphicsObject *pgo = scene()->items().at(0)->toGraphicsObject();
       QGraphicsWidget *pgw = qobject_cast<QGraphicsWidget*>(pgo);
       m_pgw = pgw;
//        setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
   }
 
   virtual void resizeEvent(QResizeEvent *event)
   {
       double cx, cy;
       double khw = double(event->size().height()) / double(event->size().width());
       if( khw > (double(m_cyWorld)/double(m_cxWorld)) )
           cy = m_cyWorld, cx = (cy/khw);
     else
           cx = m_cxWorld, cy = (cx*khw);
 
QGraphicsWidget *pgw = m_pgw;
pgw->setPos( 0,0 );
pgw->resize(cx+2,cy+2);
//pgw->setCacheMode(QGraphicsItem::ItemCoordinateCache);
pgw->setCacheMode(QGraphicsItem::ItemCoordinateCache,(pgw->boundingRect().size()*2).toSize());// pgw->setScale( .5 );
setSceneRect(0,0,cx,cy);
fitInView(sceneRect(), Qt::IgnoreAspectRatio);
}
};
void QMainWindow_SetCentralWidgetGraphics( QMainWindow *pw, int cxWorld=800, int cyWorld=600 )
{
   QGraphicsScene *pscene = new QGraphicsScene( 0, 0, cxWorld, cyWorld, pw ), &scene = *pscene;
 
   QWidget *pwc = pw->centralWidget();
   GraphicsView *pview = new GraphicsView(&scene,cxWorld,cyWorld,pw);
   pwc->setParent( NULL );
 
   // добавляем центральный виджет к сцене
   scene.addWidget(pwc);//,Qt::Window);
 
   // устанавливаем новый центральный виджет в окне
   pw->setCentralWidget( pview );
   pview->SaveCurMainWidget();
}
/*****************************************************************************/
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   MainWindow w;
   QMainWindow_SetCentralWidgetGraphics( &w, 640, 480 );
   w.show();
 
   return a.exec();
}
 
проблемной является строчка:
Код
C++ (Qt)
pgw->setCacheMode(QGraphicsItem::ItemCoordinateCache,(pgw->boundingRect().size()*2).toSize());
 
Т.е. в этом коде нет масштаба именно в 2 раза, тут есть произвольное масштабирование в зависимости от размеров окна при помощи ф-ии fitInView, зато размер кэша устанавливается именно в 2 раза больше текущего размера.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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