سؤال

وأنا أعلم أن هذا هو محددة للغاية C ++ وكيو تي مسألة ذات الصلة، ولكن ربما شخص يمكن أن تساعدني، على أي حال ...

وراجع التعليمات البرمجية أدناه: أريد أن عرض صورة داخل منطقة التمرير. يقوم الميناء نظرا لمنطقة التمرير يكون الحجم الأولي المحددة. وهذا يعني، إذا حجم الصورة أكبر من الحجم الأولي للميناء الرأي، وأشرطة التمرير تكون واضحة، وإلا لا.

// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );

// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );

ويجب أن يكون من الممكن تغيير حجم التطبيق بالكامل بحيث ميناء رأي سيحصل حجم أخرى من واحد الأولي.

ولسوء الحظ لم أكن قادرا على معرفة كيفية تعيين حجم ميناء الرأي. يبدو آلية تخطيط كيو تي لتحديد الحجم الافتراضي للمنفذ العرض، ولكن حتى الآن أنا لم أكن قادرا على تغييره. تحديد حجم جديد مع

area->setMinimumSize( QSize( 300, 300 ) );

وسوف فعلا تعيين حجم طالب، ولكن بعد منطقة التمرير يفقد القدرة على الحصول على حجمها إلى حجم أصغر من 300X300.

وأي أفكار؟

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

المحلول

وأعتقد أن كنت تبحث في المشكلة بطريقة خاطئة. وQScrollArea هو مجرد القطعة التي وضعت في إطار أو QMainWindow. يتم التحكم في حجم القطعة من تصميم الأداة التي تحتوي عليه.

ونلقي نظرة على هذا المثال من ترولتيك: عارض الصور مثال

نصائح أخرى

هل منطقة التمرير لأعلى مستوى القطعة؟ إذا كان الأمر كذلك، مجرد دعوة

area->resize(300,300);

واذا كان داخل التسلسل الهرمي تحتاج إلى تغيير حجم المستوى الأعلى بشكل مناسب (مجمع)، أو تعيين minimumSize في المنطقة. يمكنك أيضا محاولة لتجربة مع LayoutPolicy - على افتراض sizeHint هو QSize (300300) التي يمكن أن تعطيه السياسة المناسبة وفقا لحجم ما هو محدد في <لأ href = "https://doc.qt.io/qt-5/ qsizepolicy.html # السياسات التعداد "يختلط =" نوفولو noreferrer "> https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

ويمكنك محاولة:

class MyScrollArea : public QScrollArea
{
    virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};

// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );

ولكن تخطيط وكيو تي هو مثير للدهشة الفودو. ومن IMO الجزء الأقل وظيفية.

وإذا لم يفلح ذلك، حاول يدعو QWidget :: تغيير () على مختلف الحاجيات.

وأنا لا أعتقد أنك تستطيع أن تفعل ذلك بالضبط بسهولة جدا، وهو (إذا أنا أقرأ بشكل صحيح)، وحجم القطعة بحيث المنطقة الداخلية هي 300X300. كنت قد تكون قادرة على حلوى، ولكن، منذ ناحية التمرير هو نوع من الإطار، الذي يرث من QWidget. هذا يعني أنك يمكن أن مجرد دعوة area->resize( 300 + fudge, 300 + fudge )، حيث تمثل القيم حلوى للحصول على الجزء الضئيل تناولها من قبل رسم الإطار.

وأنا لست متأكد من أن هذا سيعمل في الحوار يمكن تغيير حجم حيوي، ولكن. أنا لم تفعل أي شيء تماما مثل هذا.

إذا كنت تحاول عرض صورة داخل منطقة التمرير، وأفضل رهان لن مع التسمية.

ويجب عليك أن تحاول استخدام QGraphicsView / QGraphicsScene / QGraphicPixmapItem (بدلا من منطقة التمرير والتسمية). أداء أفضل بكثير عند عرض الصور. منطقة التمرير والتسمية وإعادة رسم الصورة سيئة للغاية وأنت تتحرك حول استخدام أشرطة التمرير.

وعلى سبيل المثال، لديك ملف ".ui" مع QGraphicsView على واجهة المستخدم الرسومية يسمى "qgvImageView" وكيماغي يسمى "صورة" ...

QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);

وتحقق من وثائق QT. راجع للشغل: وقدم هذا في كيو تي 4.2

ولست متأكدا إذا كان هذا سوف يحدد على وجه التحديد مشكلة، ولكن هناك فرصة أن QGraphicsView سيكون رد فعل الأفضل أن ما نحاول القيام به.

وماذا عن استخدام

area->setGeometry(int x, int y, int w, int h);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top