2010-03-22 13 views
5

मैं अपने क्यूग्राफिक्स व्यू में एक पृष्ठभूमि छवि रखना चाहता हूं जो व्यूपोर्ट के आकार में स्क्रॉलबार के बिना और कुंजीपटल और माउस के साथ स्क्रॉल किए बिना हमेशा स्केल (और यदि आवश्यक हो तो फसल हो)। नीचे दिया गया उदाहरण यह है कि मैं व्यूपोर्ट में एक छवि को स्केल और फसल करने के लिए क्या कर रहा हूं, लेकिन मैं एथर्ड से बाहर की गई फसल के लिए यादृच्छिक मानों का उपयोग कर रहा हूं। मुझे एक तार्किक समाधान चाहिए?QGraphicsView स्क्रॉलिंग और छवि स्केलिंग/क्रॉपिंग

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 

    ui->setupUi(this); 
    scene = new QGraphicsScene(this); 

    ui->graphicsView->resize(800, 427); 
    // MainWindow is 800x480, GraphicsView is 800x427. I want an image that 
    // is the size of the graphicsView. 

    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    // the graphicsView still scrolls if the image is too large, but 
    // displays no scrollbars. I would like it not to scroll (I want to 
    // add a scrolling widget into the QGraphicsScene later, on top of 
    // the background image.) 


    QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg"); 
    QPixmap sized = backgroundPixmap->scaled(
      QSize(ui->graphicsView->width(), 
        ui->graphicsView->height()), 
      Qt::KeepAspectRatioByExpanding); // This scales the image too tall 

    QImage sizedImage = QImage(sized.toImage()); 
    QImage sizedCroppedImage = QImage(sizedImage.copy(0,0, 
     (ui->graphicsView->width() - 1.5), 
     (ui->graphicsView->height() + 19))); 
    // so I try to crop using copy(), and I have to use these values 
    // and I am unsure why. 

    QGraphicsPixmapItem *sizedBackground = scene->addPixmap(
     QPixmap::fromImage(sizedCroppedImage)); 
    sizedBackground->setZValue(1); 
    ui->graphicsView->setScene(this->scene); 
} 

मैं पैमाने और QGraphicsView है कि जब भी मैं QGraphicsView का आकार बदलने के लिए काम करेंगे के आकार के एक चित्र काटने के लिए एक तरह से पता करने के लिए करना चाहते हैं। 1.5 और 1 कहां से आ रहे हैं?

संपादित करें; मैंने setBackgroundBrush का उपयोग करने का भी प्रयास किया है, लेकिन मुझे स्केल किए गए/फसल QImage/QPixmap का उपयोग करते समय भी एक टाइल पृष्ठभूमि मिलती है।

संपादित करें; मेरा समाधान अब तक परिणाम प्राप्त करने के लिए drawBackground() को ओवरराइड करना है, लेकिन यह अभी भी मुझे एक qgraphicsview के व्यूपोर्ट आकार में छवि को आकार देने का तरीका जानने में मदद नहीं करता है। किसी भी और जवाब की सराहना की जाएगी।

void CustomGraphicsView::drawBackground(QPainter * painter, const QRectF & rect) 
{ 

    qDebug() << "background rect: " << rect << endl; 

    QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg"); 
    QPixmap sized = backgroundPixmap->scaled(QSize(rect.width(), rect.height()), Qt::KeepAspectRatioByExpanding); 

    painter->drawPixmap(rect, sized, QRect(0.0, 0.0, sized.width(), sized.height())); 

} 

उत्तर

1

आप sceneRect चाहते हैं तो बस width और height नहीं। आकार बदलने पर स्केलिंग के लिए आप स्लॉट को sceneRectChanged से कनेक्ट करना चाहते हैं ताकि जब भी दृश्य आकार बदल जाए, तो आप छवि का आकार बदल सकते हैं।

या आप एक QGraphicsView को एक ओवरराइड updateSceneRect के साथ प्राप्त कर सकते हैं जो छवि आकार को बदलता है, या बेहतर अभी तक, drawBackground ओवरराइड करें।

+0

प्रलेखन से: "दृश्य रेक्ट दृश्य की सीमा को परिभाषित करता है, और देखने के मामले में, इस दृश्य है कि आप का उपयोग कर नेविगेट कर सकते हैं के क्षेत्र का मतलब स्क्रॉल बार। " viewRect वह नहीं है जो मैं चाहता हूं, जो मुझे दृश्य का आकार देता है, भले ही व्यूपोर्ट आयाम क्या हों। मुझे व्यूपोर्ट आयाम चाहिए। मैं उन आयामों को एक छवि आकार देना चाहता हूं। यह आसान लगता है; qgraphicsview की चौड़ाई/ऊंचाई पकड़ो और नौकरी की जानी चाहिए। लेकिन जब मैं उस आकार में एक छवि स्केल करता हूं तो चौड़ाई और ऊंचाई सही नहीं होती है: यहां गायब भाग क्या है? मैं drawBackground का प्रयास करूंगा। – user298725

0

मुझे व्यूपोर्ट के आकार को प्राप्त करने के लिए ui->graphicsView->viewport()->size() मिला। विजेट के तैयार होने के बाद ही काम करता है।

0

QGraphicsView::fitInView बिल्कुल यह करता है। प्रलेखन के अनुसार, इसे आमतौर पर resizeEvent में रखा जाता है। sceneRects का उपयोग करता है दृश्य में पूरे दृश्य फिट:

void CustomGraphicsView::resizeEvent(QResizeEvent *) 
{ 
    this->fitInView(this->sceneRect()); 
} 
संबंधित मुद्दे