[erledigt] größe von QGraphicsView

Alles zum Qt Framework für Java
Antworten
costa
Beiträge: 4
Registriert: 3. Juli 2007 19:30

[erledigt] größe von QGraphicsView

Beitrag 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.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
costa
Beiträge: 4
Registriert: 3. Juli 2007 19:30

Beitrag 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
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
costa
Beiträge: 4
Registriert: 3. Juli 2007 19:30

Beitrag 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.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
costa
Beiträge: 4
Registriert: 3. Juli 2007 19:30

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :)
Antworten