2013-06-10 23 views
13

Tôi đang làm việc trên chương trình hiển thị cho người dùng một số hình ảnh do anh ta chọn. Nhưng có một vấn đề bởi vì tôi muốn phù hợp với hình ảnh này trong khung của QGraphicsView và hình ảnh thực sự nhỏ hơn khung hình.Qt5 C++ QGraphicsView: Hình ảnh không phù hợp với khung nhìn

Vì vậy, đây là mã của tôi:

image = new QImage(data.absoluteFilePath()); // variable data is defined when calling this method 
scn = new QGraphicsScene(this); // object defined in header 
ui->graphicsView->setScene(scn); 
scn->addPixmap(QPixmap::fromImage(*image)); 
ui->graphicsView->fitInView(scn->itemsBoundingRect(),Qt::KeepAspectRatio); 

Tôi đã cố gắng rất nhiều giải pháp mà tôi tìm thấy trên web, nhưng không ai không giúp tôi. Ảnh có kích thước khoảng 40 x 60 px khi khung hình là 200 x 400 pixel. Điều gì có thể sai?

Dưới đây là một số ví dụ về những gì được sản xuất với mã trên và những gì tôi muốn thoát khỏi: enter image description here

+0

tôi có thể không tái tạo hành vi này. Hình ảnh được chia tỷ lệ hoàn hảo. –

+0

Vui lòng xem câu hỏi đã chỉnh sửa. Cảm ơn! – user1257255

+0

Tôi biết nó không phải là vấn đề nhưng nếu bạn kéo dài hình ảnh đó nhiều, tôi sẽ có một chút xấu xí ... hơn nữa, bạn muốn giữ tỷ lệ khía cạnh đó là không giống nhau (hình ảnh là 2/3 & khung là 1/2 ...) Có thể với khung 200 * 300? –

Trả lời

16

Giải pháp cho câu hỏi của tôi là showEvent() cho Hộp thoại. Điều này có nghĩa là bạn không thể gọi hàm fitInView() trước khi biểu mẫu được hiển thị, vì vậy bạn phải tạo showEvent() cho hộp thoại và hình ảnh sẽ được gắn vào khung của QGraphics View.

Và mã ví dụ mà bạn cần phải thêm vào mã thoại của:

void YourClass::showEvent(QShowEvent *) { 
    ui->graphicsView->fitInView(scn->sceneRect(),Qt::KeepAspectRatio); 
} 
+0

Chúa Giêsu Kitô! Cảm ơn bạn! Tôi đã tìm kiếm tất cả Tài liệu Qt để cố gắng hiểu vấn đề và nó không có tham chiếu cho vấn đề này! – emanuelcds

+1

Tôi gặp sự cố sau này, bạn đã giải quyết vấn đề về đường viền pixel trắng như thế nào?Tôi có một QDeclarativeView (đó là một GraphicsView) và cố gắng fitInView cho scene() -> itemsBoundingBox() có kết quả là 1920x1080 pixel. Mặc dù nó vẫn còn với một đường viền màu trắng 5 pixel (vì màu nền cảnh). Nếu tôi làm một setAlign (Qt :: Left | Qt :: Top), chỉ có lề dưới bên phải được hiển thị. Bất kỳ gợi ý nào? – emanuelcds

0

Lý do bạn không nhìn thấy hình ảnh của bạn như bạn muốn đó là vì chức năng QGraphicsView fitInView không làm những gì bạn nghĩ.

Điều này đảm bảo đối tượng vừa với khung nhìn, không có chồng chéo đường viền, vì vậy nếu đối tượng của bạn không có trong khung nhìn, gọi fitInView sẽ làm cho khung nhìn di chuyển/tỷ lệ v.v. là hoàn toàn có thể nhìn thấy. Ngoài ra, nếu chế độ xem quá nhỏ cho khu vực được cung cấp cho fitInView, sẽ không có gì xảy ra.

Vì vậy, để có được những gì bạn muốn, ánh xạ độ mở rộng của tọa độ GraphicsView với GraphicsScene và sau đó đặt tọa độ cảnh của hình ảnh thành các tọa độ đó. Như @VBB đã nói, nếu bạn kéo giãn hình ảnh, nó có thể thay đổi độ rai khía cạnh, vì vậy bạn có thể sử dụng scaledToWidth trên QPixmap.

Something như thế này: -

QRectF sceneRect = ui->graphicsView->sceneRect(); // the view's scene coords 
QPixmap image = QPixmap::fromImage(*image); 

// scale the image to the view and maintain aspect ratio 
image = image.scaledToWidth(sceneRect.width()); 

QGraphicsPixmapItem* pPixmap = scn->addPixmap(QPixmap::fromImage(*image)); 

// overloaded function takes the object and we've already handled the aspect ratio 
ui->graphicsView->fitInView(pPixmap); 

Bạn có thể thấy rằng bạn không cần các cuộc gọi đến fitInView, nếu khung nhìn của bạn là ở đúng nơi và nếu bạn không muốn nó trông pixellated, sử dụng hình ảnh có độ phân giải cao.

0

Bạn nên xử lý thay đổi kích thước sự kiện, tôi đoán đó là cách nó có nghĩa là để được chơi:

bool YourDialog::eventFilter(QObject *obj, QEvent *event) 
{ 
     if (event->type() == QEvent::Show){ 
      ui->conceptView->fitInView(conceptScene->sceneRect(), Qt::KeepAspectRatio); 
     } 

     if (event->type() == QEvent::Resize){ 
      ui->conceptView->fitInView(conceptScene->sceneRect(), Qt::KeepAspectRatio); 
     } 
} 
Các vấn đề liên quan