2012-10-29 27 views
8

Jedną z niesamowitych funkcji QGraphicsView jest możliwość skalowania się z zawartością sceny (każdy QGraphicsItem wstawiony do sceny). QPixmap że została włożona prawidłowo łuski, co oznacza, że ​​jeśli zapewnić współczynnik skali 4x4 z tym:Dopasowywanie grubości QPen podczas skalowania QGraphicsView?

view->scale(4,4); 

Pixmap duże jak chcę zrobić.

Ale tak nie jest w przypadku rectów, z których jestem przyzwyczajony do rysowania; zamierzają otoczyć pixmapy, które rysuję na mojej scenie i niezależnie od współczynnika skali, zachowują grubość 1 zamiast - jak sądzę - 4.

Szukałem dokumentacji o tym wszystkim, próbując dokładny cel "długopisu kosmetycznego", ale nadal nie mogę sprawić, by mój prostokąt stał się grubszy.

Ostatnia uwaga: Mam zwyczaj QGraphicsItem i QPen który służy do rysowania rectangled jest instanciated on-the-fly w metodzie

virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 

.

Czy to ma znaczenie?

góry dzięki i przeprosiny dla mojego braku doświadczenia/wiedzy zarówno w ramach Qt i pól algorytmów rysunek ...

+0

Pokaż użyć kodu gdzie utworzyć 'QPen'. – cmannett85

+0

Tutaj mamy: 'QPen borderPen (Qt :: black); borderPen.setCosmetic (false); malarz-> setPen (borderPen); ' –

Odpowiedz

12

To naprawdę nie ma znaczenia, gdzie instancję QPen.

QPen ma domyślną szerokość 0. Jest to wartość specjalna, która oznacza, że ​​kosmetyk jest prawdziwy, a szerokość jest faktycznie 1. Więc jeśli nie chcesz, aby pióro było kosmetyczne, musisz ustawić je na żądaną szerokość . Może być również konieczne ustawienie wartości "kosmetyczne" na "fałsz".

Oto prosty przykład:

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QGraphicsView view; 
    QGraphicsScene scene; 

    QGraphicsRectItem *item1 = scene.addRect(20, 20, 20, 20); 
    QGraphicsRectItem *item2 = scene.addRect(50, 20, 20, 20); 

    QPen pen1, pen2; 
    pen1.setWidth(5); 
    pen2.setWidth(5); 
    pen1.setCosmetic(true); 
    pen2.setCosmetic(false); 

    item1->setPen(pen1); 
    item2->setPen(pen2); 

    view.setScene(&scene); 
    view.scale(4, 4); // both rects are the same size, but one a has wider pen 
    view.show(); 

    return a.exec(); 
} 
+0

Przykład działa dobrze, ale kiedy komentuję linie setWidth(), oba prostokąty zachowują tę samą grubość na krawędziach. Dziękuję i tak –

+1

To dlatego, że domyślna szerokość to 0, co jest kosmetyczne. Musisz zmienić szerokość na 1 lub więcej, jeśli chcesz zwiększyć grubość wraz ze skalą. – Anthony

+0

Świetnie to działa dobrze! Dzięki po raz trzeci Anthony :) –