سؤال

QScrollArea ، لسبب ما، وتجاهل الإعداد contentMargins عندما مجموعة QGraphicsView كما القطعة لها. أبحث في المقتطف أدناه، يمكن للشخص من فضلك قل إذا أنا أفعل شيئا خاطئا أو قد يكون خطأ في SDK؟

ومقتطف 1 (يعمل الكمال):

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

ومقتطف 2 (انها مثل setContentMargins () يتم تجاهل الدعوة تماما ):

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

وشكرا.

هل كانت مفيدة؟

المحلول

ويبدو وكأنه لا يجب الخلط بين هيكل كيفية عش QGraphicsView وQGraphicsScene. (ربما كان ذلك مجرد خطأ مطبعي؟)

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

وينبغي تغييرها إلى

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

أو

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

وعند إضافة QWidget إلى تخطيط، قمت بتغيير الأم الأداة. عند تعيين القطعة (أو QGraphicsView) إلى QScrollArea، قمت بتغيير الأم أن الأداة. انظر الأشجار كائن وبيانات الملكية للحصول على مزيد من المعلومات. حتى إذا كنت تريد اقامة QGraphicsView الخاص داخل QScrollArea أن التعليمات البرمجية الخاصة بك تبدو هذه:

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

وكملاحظة جانبية ...

عند استخدام QGraphicsViews مع QGraphicsScene، بدلا من تحديد هوامش باستخدام setContentsMargins على QScrollArea، وأنا استخدم التمرير التلقائي QGraphicsView ومجرد مجموعة المستطيل مكان الحادث ليكون لها هامش كبير أن حجم المحتوى الخاص بي مثل ذلك:

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

ووQGraphicsView يتضمن قدرا كبيرا أكثر من التمرير فقط التلقائي عند الحاجة. يمكنك تغيير كل شيء داخل منه وأكثر قليلا جدا. انه امر رائع ل2D تخطيطات، والتفاعلات والرسوم المتحركة. رؤية الرسومات عرض الإطار كيو تي في http://doc.qt.io/qt-5/ graphicsview.html للحصول على مزيد من المعلومات.

وهنا مزيد من المعلومات التي قد تكون مفيدة عند استخدام الهوامش وسائد: <لأ href = "http://doc.qt.io/qt-5/stylesheet-customizing.html#box-model" يختلط = "نوفولو noreferrer "> ووصندوق نموذج يستخدمه QStyleSheets.

نصائح أخرى

لجعل هوامش المحتوى تعمل بشكل صحيح لQScrollArea القطعة I فئة فرعية عليها وتعيين يدويا على هامش العرض (وهو أسلوب المحمية في 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();
//...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top