Domanda

QScrollArea , per qualche ragione, sta ignorando l'impostazione contentMargins quando ho impostato QGraphicsView come il suo widget. Guardando il frammento di codice qui sotto, qualcuno può dire se sto facendo qualcosa di sbagliato o potrebbe essere un bug nel SDK?

Snippet 1 (funziona perfettamente):

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 (E 'come setContentMargins () chiamata viene ignorata completamente ):

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();

Grazie.

È stato utile?

Soluzione

Sembra che si sta confondendo la struttura di come il nido di un QGraphicsView e QGraphicsScene. (Forse era solo un errore di battitura?)

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

deve essere modificato in

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

o

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

Quando si aggiunge un QWidget a un layout, si cambia genitore del widget. Quando si imposta un widget (o QGraphicsView) per un QScrollArea, si cambia genitore che del widget. Vedere Object Alberi & Proprietà per ulteriori informazioni. Quindi, se si voleva impostare il QGraphicsView all'interno di un QScrollArea il codice sarebbe simile a questa:

    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();

Come nota a margine ...

Quando si utilizza QGraphicsViews con un QGraphicsScene, invece di impostare i margini utilizzando setContentsMargins di un QScrollArea, io uso lo scorrimento automatico QGraphicsView e basta impostare il rettangolo scena di avere un margine più grande che la dimensione dei miei contenuti in questo modo:

    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();

Il QGraphicsView comprende un po 'più di scorrimento solo automatica in caso di necessità. È possibile ridimensionare tutto all'interno di esso e un bel po 'di più. E 'ottimo per 2D layout, le interazioni e animazioni. Vedi di Qt Graphics View quadro a http://doc.qt.io/qt-5/ graphicsview.html per ulteriori informazioni.

Ecco ulteriori informazioni che possono essere utili quando si utilizzano i margini e padding: Il modello di sicurezza utilizzato da QStyleSheets.

Altri suggerimenti

Per rendere i margini di contenuto corretto funzionamento per un QScrollArea widget di I sottoclasse e impostare manualmente i margini viewport (che è un metodo protetto in 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();
//...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top