Seite 1 von 1

[erledigt] größe von QGraphicsView

Verfasst: 3. Juli 2007 20:09
von costa
Hallo, ich bin neu hier.
Ich habe gerade mit Qt und Jambi angefangen und bin jetzt auf ein Problem gestoßen.

Ich habe ein QGraphicsScene und ein QGraphicsView erstellt. Wenn ich jetzt jedoch die Höhe oder Breite des QGraphicsView will, bekomme ich immer 480 und 640, egal wie groß QGraphicsView ist.

Hier die relevanten Codeteile:

Code: Alles auswählen

        QGraphicsScene scene = new QGraphicsScene(this);
        scene.setItemIndexMethod(QGraphicsScene.ItemIndexMethod.NoIndex);
        
        QGraphicsView view = new QGraphicsView(scene);
        view.setRenderHint(QPainter.RenderHint.Antialiasing);
        view.setBackgroundBrush(new QBrush(new QColor(QColor.white)));
        view.setCacheMode(new  QGraphicsView.CacheMode(QGraphicsView.CacheModeFlag.CacheBackground));

        QGridLayout layout = new QGridLayout();
        layout.addWidget(view,0,0);
        setLayout(layout);
        
        setWindowTitle("title");
        resize(800,600);
        view.setSceneRect(0,0,view.width(),view.height());
        System.out.println(view.width()+"  "+view.height());
Das System.out.println gibt immer "640 480", auch wenn ich die Fenstergröße ändere. Habe ich einen Denkfehler? Wie bekomme ich die Höhe/Breite von view oder ist das ein Bug?
Danke schonmal im Vorraus.

Verfasst: 4. Juli 2007 14:37
von ArneStocker
Hi

also ich habe das mal nachgebaut und der folgende Code funktioniert einwandfrei

Code: Alles auswählen

public class TestWidget extends QWidget {
    
        QGraphicsView m_view = null;

    /* MAIN */ 
    public static void main(String args[]) {
        QApplication.initialize(args);

        final TestWidget testwidget = new TestWidget();
        testwidget.show();
        QApplication.exec();
    }
    
    /* KONSTRUKTOR */
    public TestWidget() {
        QGraphicsScene scene = new QGraphicsScene(this);
        scene.setItemIndexMethod(QGraphicsScene.ItemIndexMethod.NoIndex);
       
        m_view = new QGraphicsView(scene);
        m_view.setRenderHint(QPainter.RenderHint.Antialiasing);
        m_view.setBackgroundBrush(new QBrush(new QColor(QColor.white)));
        m_view.setCacheMode(new  QGraphicsView.CacheMode(QGraphicsView.CacheModeFlag.CacheBackground));

        QGridLayout layout = new QGridLayout();
        layout.addWidget(m_view,0,0);
        setLayout(layout);
       
        setWindowTitle("TestWidget");
        resize(800,600);
        m_view.setSceneRect(0,0,m_view.width(),m_view.height()); 
        System.out.println(m_view.width()+"  "+m_view.height()); 
    }

    /* RESIZE-EVENT*/
    /**
     * @see com.trolltech.qt.gui.QWidget#resizeEvent(com.trolltech.qt.gui.QResizeEvent)
     */
    @Override
    protected void resizeEvent(QResizeEvent event) {
        super.resizeEvent(event);
       //  System.out.println(m_view.width()+"  "+m_view.height()); 
    }    
}
d.h. alle Änderungen der Größe resultieren in einer entprechenden Ausgabe auf der Console.
If the widget is visible when it is being resized, it receives a resize event (resizeEvent) immediately. If the widget is not currently visible, it is guaranteed to receive an event before it is shown.
Möglicherweise ist Dein Fenster beim Resize noch gar nicht sichtbar. Ansonsten schalte doch ggf. ein processEvents() dazwischen, damit die Fenstergröße sofort angepasst wird.

Gruß Arne

Verfasst: 4. Juli 2007 16:59
von costa
hi

vielen dank für hilfe, das hat mir jetzt weitergeholfen.
Ich rufe jetzt setSceneRect erst im resizeEvent auf, und dann funktioniert alles super.

Seltsamerweise zeigt er jetzt immer noch Scrollleisten an. Eigentlich sind die doch jetzt gar nicht mehr notzwendig?

Gruß Costa

Verfasst: 4. Juli 2007 19:05
von ArneStocker
... wenn die Größe der GraphicsScene (bei der gewählten Skalierung) größer ist als der View, dann muss gescrollt werden. Um das zu verhindern müsstest du die Skalierung anpassen ... oder habe ich was falsch verstanden

Gruß Arne

Verfasst: 4. Juli 2007 20:12
von costa
ArneStocker hat geschrieben:... wenn die Größe der GraphicsScene (bei der gewählten Skalierung) größer ist als der View, dann muss gescrollt werden. Um das zu verhindern müsstest du die Skalierung anpassen ... oder habe ich was falsch verstanden
Ja, aber mit

Code: Alles auswählen

view.setSceneRect(0,0,view.width(),view.height());
müsste GraphicsView doch genau so groß sein wie GraphicsScene. Es müssten also keine Scrollleiste zu sehen sein. Das passiert bei mir aber erst genau dann wenn ich mindestens 4px von Höhe und Breite abziehe:

Code: Alles auswählen

view.setSceneRect(0,0,view.width()-4,view.height()-4);
Erst dann sehe ich keine Scrolleiste mehr. Aber das muss doch auch schöner gehen.

Verfasst: 4. Juli 2007 21:27
von ArneStocker
das ist jetzt nur 'ne Vermutung, aber wahrscheinlich wird ein Abstand von 2px mit eingerechnet. Versuchs doch mal mit setViewportMargins(0,0,0,0) und sag Bescheid, wenn es geklappt hat.

Gruß Arne

Verfasst: 4. Juli 2007 23:34
von costa
hi
ich habs jetzt hinbekommen, aber nicht mit setViewportMargins(0,0,0,0). ich habe StyleSheets benutzt, und zwar:

Code: Alles auswählen

setStyleSheet("QGraphicsView { border: none }");
Der Rand ist jetzt weg und es funktioniert alles so wie ichs erwarte.Jetzt will ich nur noch den Rand zwischen Fenster und GraphicsView wegbekommen, das hab ich bisher auch nicht mit StyleSheets hinbekommen.

Verfasst: 21. Januar 2008 20:08
von franzf
Sorry, ist jetzt wahrscheinlihc zu spät, aber wenn noch jemand drauf stoßen sollte:
Für dein Problem ist wohl eher

Code: Alles auswählen

void QGraphicsView::fitInView ( const QRectF & rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio )
geeignet, das umgeht das "böse" Entfernen der Borders :)