2012-12-19 19 views
5

Rysuję kilka prostokątów wewnątrz QGraphicsView; Używam do nich niestandardowego wzoru stipple, tworząc QBrush z moim QPixmap. Zostanie wyświetlony zgodnie z domyślnym poziomem powiększenia zgodnie z oczekiwaniami.Jak zrobić qt qgraphicsview skalę, aby nie wpływać na wzór stipple?

Kiedy dzwonię pod numer view->scale(), prostokąty będą się wyświetlać większe lub mniejsze, zgodnie z oczekiwaniami. Jednak Qt skaluje poszczególne bity wzoru stipple, które nie są oczekiwane; Spodziewałem się, że za pomocą pędzla narysuje większy lub mniejszy prostokąt. Np. Gdybym użył wzoru stipple z pikselową kropką i pikselową przestrzenią, po powiększeniu chciałbym zobaczyć większy prostokąt, ale chcę ten sam wzór splatania z tymi samymi pikselami. Czy to w jakiś sposób jest osiągalne? Dzięki.

Odpowiedz

5

Wpadłem na ten sam problem, tworząc narzędzie towarzyszące EDA w Qt.

Po kilku próbach, co zrobiłem (i wydaje się, że działa dla mnie) jest stworzenie niestandardowego elementu graficznego. W sprawie sposobu malowania, robię:

QBrush newBrush = brush_with_pattern; 
newBrush.setTransform(QTransform(painter->worldTransform().inverted())); 
painter->setBrush(newBrush); 

To zastosować transformację odwrotną elementu do szczotki (tak, to nie w skali).

Myślę, że setDashOffset jest tylko dla granicy kształtów (nie wypełnienia).

+0

Czy nie zrobiłoby to samo, aby ustawić ItemIgnoresTransformations? – Schollii

0

Można użyć QPen :: setDashOffset:

http://harmattan-dev.nokia.com/docs/library/html/qt4/qpen.html#setDashOffset

Musisz ustawić przesunięcie w oparciu o sceny zoom/poziomu skali. Możesz pobrać wskaźnik do sceny w swoim przedmiocie, wywołując scene(), nie zapomnij sprawdzić NULL, ponieważ będzie on miał wartość NULL, gdy nie zostanie dodany do sceny (chociaż teoretycznie nie powinieneś dostać farby() gdy nie znajduje się w scenie).

Inną opcją jest użycie:

http://doc.qt.digia.com/qt/qpainter.html#scale

cofnąć widoki skalowania na malarza.

+0

Dzięki za odpowiedź. Myślę, że nie wyjaśniłem dobrze. Chcę skalować rozmiar prostokąta, ale wzór splotu pozostanie taki sam. – Kaniyan

+0

przy użyciu setDashOffset powinien osiągnąć ten wynik, na przykład przy 100% przesunięcie myślnika może wynosić 1, więc przy 50% można go zmienić 0.5, a wzór powinien wyglądać tak samo (ale rect będzie dwa razy mniejszy). – paulm

+0

Używam QBrush do ustawienia wzoru stipple. Szukałem metody * Offset w pędzlu. Nie móc zobaczyć. – Kaniyan

0

Jeśli ktoś nadal się na to patrzy, może pomóc a related question here dotyczące skalowania standardowych wzorców wypełnienia zamiast wzorów wypełnienia pikseli. Zasadniczo może nie być możliwe modyfikowanie skalowania standardowych wzorców wypełnień (lista zawiera kilka pomysłów na obejście), ale praca z wartościami alfa daje pożądany efekt, jeśli szukasz różnych kolorów, szczególnie poziomów szarości - i jest znacznie mniejsza zwinięty.