Question

QScrollArea , pour une raison quelconque, est en ignorant le réglage de contentMargins quand ensemble I QGraphicsView comme son widget. En regardant l'extrait ci-dessous, quelqu'un peut-il s'il vous plaît dire si je fais quelque chose de mal ou il pourrait être un bug dans le SDK?

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.

Était-ce utile?

La solution

Il semble que vous confondez la structure de la façon d'imbriquer un QGraphicsView et un QGraphicsScene. (Peut-être qu'il était juste une faute de frappe?)

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

doit être remplacé par

    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 changez le parent du widget. Lorsque vous définissez un widget (ou QGraphicsView) à un QScrollArea, vous changez le parent de ce widget. Voir arbres d'objet et de propriété 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 côté ...

Lors de l'utilisation QGraphicsViews avec un QGraphicsScene, au lieu de fixer les marges en utilisant une 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 que le défilement automatique juste en cas de besoin. Vous pouvez redimensionner tout à l'intérieur de celui-ci et un peu plus. Il est idéal pour mises en page 2D, des interactions et des animations. Voir cadre Voir graphique Qt http://doc.qt.io/qt-5/ graphicsview.html pour plus d'informations.

Voici plus d'informations qui peuvent être utiles lors de l'utilisation des marges et rembourrages: Le modèle de boîte utilisé par QStyleSheets.

Autres conseils

Pour rendre les marges de contenu fonctionnent correctement pour un QScrollArea widget 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();
//...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top