2011-10-20 3 views
0

QScrollArea, pour une raison quelconque, ignore le paramètre contentMargins lorsque j'ai défini QGraphicsView comme widget. En regardant l'extrait ci-dessous, quelqu'un peut s'il vous plaît dire si je fais quelque chose de mal ou ce pourrait être un bug dans le SDK?QScrollArea ne respectant pas le paramètre contentMargins

Snippet 1 (fonctionne parfaitement):

QWidget *appWindow = new QWidget; 

QScrollArea *sa = new QScrollArea(appWindow); 
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
sa->setContentMargins(50, 50, 50, 50); 

QWidget *widgetToScroll = new QWidget(sa); 
widgetToScroll->resize(5000, 5000); 
sa->setWidget(widgetToScroll); 

QVBoxLayout *appWindowLayout = new QVBoxLayout(appWindow); 
appWindowLayout->addWidget(sa); 
appWindow->setLayout(appWindowLayout); 

appWindow->show(); 

Snippet 2 (Il est comme setContentMargins() appel est ignoré complètement):

QWidget *appWindow = new QWidget; 

QScrollArea *sa = new QScrollArea(appWindow); 
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
sa->setContentMargins(50, 50, 50, 50); 

QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(sa), sa); 
widgetToScroll->setAlignment(Qt::AlignLeft | Qt::AlignTop); 
widgetToScroll->resize(5000, 5000); 
sa->setWidget(widgetToScroll); 

QVBoxLayout *appWindowLayout = new QVBoxLayout(appWindow); 
appWindowLayout->addWidget(sa); 
appWindow->setLayout(appWindowLayout); 

appWindow->show(); 

Merci.

Répondre

3

Il semble que vous confondiez la structure de l'imbrication d'un QGraphicsView et d'un QGraphicsScene. (Peut-être qu'il était juste une faute de frappe?)

QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(sa), sa); 

devrait être remplacé

QGraphicsView *widgetToScroll = new QGraphicsView(new QGraphicsScene(), sa); 

ou

QGraphicsView *widgetToScroll = new QGraphicsView(); 
    sa->setWidget(widgetToScroll); 

Lorsque vous ajoutez un QWidget à une mise en page, vous modifiez le parent du widget. Lorsque vous définissez un widget (ou QGraphicsView) sur un QScrollArea, vous modifiez le parent de ce widget. Voir Object Trees & Ownership pour plus d'informations. Donc, si vous voulez configurer votre QGraphicsView dans un QScrollArea votre code ressemblerait à ceci:

QWidget *appWindow = new QWidget; 

    QScrollArea *sa = new QScrollArea(); // No need to specify a parent here if 
             // you add it to a layout later 
    sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
    sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
    sa->setContentsMargins(50, 50, 50, 50); 

    QGraphicsView *widgetToScroll = new QGraphicsView(); 
    widgetToScroll->setAlignment(Qt::AlignLeft | Qt::AlignTop); 
    widgetToScroll->resize(5000, 5000); 
    sa->setWidget(widgetToScroll); // This sets the parent for widgetToScroll 

    QVBoxLayout *appWindowLayout = new QVBoxLayout(); 
    appWindowLayout->addWidget(sa); // This sets the parent for sa 
    appWindow->setLayout(appWindowLayout); // This sets the parent for appWindowLayout 

    appWindow->show(); 

Comme une note de côté ...

Lorsque vous utilisez QGraphicsViews avec un QGraphicsScene, au lieu de fixer les marges en utilisant un des setContentsMargins de QScrollArea, j'utilise le défilement automatique QGraphicsView et juste régler la rect scène pour avoir une plus grande marge que la taille de mon contenu comme ceci:

QWidget *appWindow = new QWidget; 

    QGraphicsView *widgetToScroll = new QGraphicsView(); 
    QGraphicsScene *scene = new QGraphicsScene(); 
    scene->addRect(0,0, 5000, 5000); 

    widgetToScroll->setSceneRect(-50,-50, 5050, 5050); 
    widgetToScroll->setScene(scene); 

    QVBoxLayout *appWindowLayout = new QVBoxLayout(appWindow); 
    appWindowLayout->addWidget(widgetToScroll); 

    appWindow->setLayout(appWindowLayout); 
    appWindow->show(); 

le QGraphicsView comprend un peu plus qu'un simple automatique scrolli ng en cas de besoin. Vous pouvez tout redimensionner à l'intérieur et un peu plus. C'est génial pour les mises en page 2D, les interactions et les animations. Voir Graphics View Framework de Qt au http://doc.qt.io/qt-5/graphicsview.html pour plus d'informations.

Voici d'autres informations utiles pour l'utilisation des marges et des paddings: The Box Model utilisé par QStyleSheets.

+0

Je suis un débutant à Qt; votre réponse détaillée m'a vraiment aidé à mieux comprendre les concepts de Qt. Je vais certainement essayer vos suggestions. – gplusplus

+0

Pas de problème. Bonne chance. – phyatt

4

Pour rendre les marges de contenu fonctionnent correctement pour un widget QScrollArea I sous-classe et définir manuellement les marges de viewport (qui est une méthode protégée QT 4,7)

// Extended class 
class QScrollAreaWithMargins : public QScrollArea 
{ 
public: 

    virtual void resizeEvent(QResizeEvent *event) override 
    { 
     // Define content margins here 
     setViewportMargins(5, 0, 0, 0); // <<<<< SET MARGINS HERE 
     QScrollArea::resizeEvent(event); 
    } 
}; 

// Usage 
//... 
mEditorScrollArea = new QScrollAreaWithMargins(); 
//... 
+0

C'est la bonne réponse. – waldyrious

+0

Impossible de voir le bois pour les arbres. Bonne réponse aussi. – Kamajii

Questions connexes