[ Sale_123 @ 26.06.2010. 00:59 ] @
Da budem iskren, skoro sam se poceo baviti QT-m, do sad sam se bavio javom. Problem je sledeci, kako okrenuti smjer ose y?

Problem sam isti imao sa javom, ali sam to rijesio tako sto sam kreirao dvije kopije Graphics2D objekta, i kod jednog sam obrnuo y osu, tako sto sam skalirao matricu (AffineTransform) sa (1,-1), jos je pomjerio na dole za visinu prozora.

Drugi Graphics2D objekt kod koga nije bila izokrenuta y osa sam koristio za iscrtavanje tekstova. E sad, prije ispisa teksta, morao sam uzeti neku koordinatu, pomnoziti je sa matricom prvog Graphics2D objekta, da bi dobio tacnu lokaciju, u onda na toj lokaciji iscrtavati tekst. Iscrtavanje grafickih oblika je bilo jednostavno, samo pozivanje funkcije draw.

Medjutim, kada bi htio da pomjeram objekte u takvoj sceni, prvo sam koordinate misa morao da pomnozim sa inverznom matricom prvog Graphics2D objekta, da bi dobio tacnu koordinatu na modelu.

Ovaj nacin mi je nekako "prljav". I lose su performanse.

Onda sam poceo da gledam sta QT ima da ponudi. Moram da priznam da je framework zaista fantasticno uradjen i da je bas jednostavan za koristenje. Medjutim, QT isto koristi sistem, gdje je tacka 0,0 u gornjem lijevom uglu, i pozitivni smjer ose y je na dole. Mjenjanje smjera ose y u samom GraphicsScene cinilo mi se kao prevelik posao i cinio mi se upitan, pa sam poceo da pisem sam svoj widget.

Medjutim, princip koji sam koristio u javi ovde nije funkcionisano. Dva QPainter-a izgleda da djele zajednicku matricu za transformacije, tako da promjena matrice u jednom painteru utice na drugi, i tekst se iscrtava naopako. Jedini nacin koji bi mogao da implementiram svoj widget je da za svaki graficki oblik vrsim obrtanje smeja y ose, a kad dodje tekst na red, onda da vracam osu y u normalu. Bojim se da bi ovo moglo isto biti sporo.

Za sad mi se jedino opengl vrti u glavi kao elegantno rjesenje. Neka druga ideja?
[ Nedeljko @ 26.06.2010. 01:17 ] @
Pa, već ti je bilo odgovoreno. Evo i ovde

Code:
void MainWindow::paintEvent(QPaintEvent *)
{
    QGraphicsScene s;
    QPainter p(this);
    QRect r = rect();

    p.setTransform(QTransform(1, 0, 0, 0, -1, 0, 0, r.height() - 1, 1));
    s.addRect(10,10,250,150);
    s.addLine(1,1,2,2);
    s.render(&p, r, r);

    QPainter q(this);
    q.drawText(t.map(QPointF(30,20)), "Ana voli Milovana");
}


Crtanje u prozor se vrši onako kako ti hoćeš. Poenta je u transformaciji koju zadaješ painteru u koji vršiš renderovanje.

[Ovu poruku je menjao Nedeljko dana 26.06.2010. u 02:32 GMT+1]
[ Sale_123 @ 26.06.2010. 01:34 ] @
Citat:
Nedeljko: Pa, već ti je bilo odgovoreno. Evo i ovde


Nisam vidio dok sam otvarao temu ;-). Evo sad cu da isprobam.