Название: В чём смысл size в ф-ии QGraphicsItem::setCacheMode и как увеличить качество
Отправлено: 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 раза. И здесь уже не до фонтов, т.к. не понятно что делать с размером.
Название: Re: В чём смысл size в ф-ии QGraphicsItem::setCacheMode и как увеличить качество
Отправлено: _OLEGator_ от Январь 28, 2014, 21:31
Показывай как выводишь элемент в 2 раза увеличенный. На вскидку, надо отказаться от непонятного увеличения элемента в 2 раза и просто рисовать сразу элемент нужного размера.
Название: Re: В чём смысл size в ф-ии QGraphicsItem::setCacheMode и как увеличить качество
Отправлено: Sasha от Февраль 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 раза больше текущего размера.
|