Seite 1 von 1

QGraphicsItem: Unterscheidung in paint() Drucker/Bildschirm?

Verfasst: 20. August 2009 15:01
von mikemc
Hallo,

wie kann ich unterscheiden, ob gerade mein QGraphicsItem am Bildschirm ausgegeben wird, gedruckt wird oder nur im PrintPreview ist?

Zwischen Drucker/Bildschirm unterscheide ich momentan in dem ich den QWidget Paramenter von paint() == NULL prüfe. Kommt mir bissl billig vor diese Lösung.

Ausserdem würde ich auch gerne unterscheiden zwischen Drucken, und Druckervorschau. Und da hab ich noch garkeine Idee.

lg Michael

Verfasst: 24. Januar 2011 15:23
von mikemc
1 1/2 Jahre später steh ich immer noch vor dem gleichen Problem :roll:

Verfasst: 24. Januar 2011 16:05
von upsala
Du könntest den Typ des QPaintDevices des QPainter überprüfen.

Verfasst: 1. Februar 2011 20:45
von mikemc
Ok danke!

Weiss nicht, ob das jetzt die eleganteste Methode ist, habe jetzt von QPrinter abgeleitet und mir eine eigenes Flag angelegt, dass gesetzt wird, wenn der Preview-Dialog aktiv ist, da beim Dialog auch ein QPrinter verwendet wird

Verfasst: 2. Februar 2011 08:45
von franzf
Ich denke, QPrinter ist die falsche Stelle, das hat eigentlich gar nix mit deinem Drucken-oder-Zeichnen-Problem zu tun, deckt es doch das Zeichnen nicht ab.
Ich würde bei QGraphicsScene ansetzen - das ableiten. Irgendwann wird das sowieso fällig, wenn du spezielle Features beim Item-Handling einbauen willst. Du kannst dann auch gleich die API nach deinem Gusto erweitern:

Code: Alles auswählen

class MyScene : public QGraphicsScene {
    enum PaintStatus {
        Paint,
        Print,
        PrintPreview
    };
    PaintStatus paintStatus_;
public:
    MyScene()
     : paintStatus_(MyScene::Paint)
    {}

    void print(QPrinter& p) {
        PaintStatus lastStatus = paintStatus_;
        paintStatus_=MyScene::Print;
        // hier auf Printer malen
        paintStatus_ = lastStatus;
    }

    QPixmap printPreview() {
        PaintStatus lastStatus = paintStatus_;
        paintStatus_=MyScene::PrintPreview;

        QPixmap previewPix;
        // hier auf previewPix malen
        paintStatus_ = lastStatus;
        return previewPix;
    }
    
    PaintStatus paintStatus() const {
        return paintStatus_;
    }
};
In der paint() deines Items prüfst du nun, was this->scene()->paintStatus() gerade macht und zeichnest entsprechend.