2017-01-17 12 views
8

Theo mặc định, Qt sử dụng cách rất đơn giản, nhanh chóng và xấu xí để chia tỷ lệ hình ảnh, Qt::FastTransformation, có lẽ là nội suy lân cận gần nhất hoặc một cái gì đó rất giống nhau.Làm thế nào để thực hiện một downscaling mịn của hình ảnh nền trong phong cách Qt?

Khi giao dịch với một QPixmap, người ta có thể chọn một tỉ lệ tốt hơn trực quan, ví dụ,

pixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation); 

Tuy nhiên, những gì chúng ta có thể làm gì nếu hình ảnh không phải là trong một đối tượng QPixmap, nhưng chỉ đơn giản là một nền tảng của một nút hoặc một số tiện ích con khác? Ví dụ, sau đây là một cách rất đơn giản để tạo nút tự động thay đổi kích thước, được tùy chỉnh hoàn toàn, phù hợp với ứng dụng độc lập với độ phân giải khi được sử dụng với bố cục và setStretch().

ui->pushButton->setStyleSheet(
    "QPushButton { border-image: url(:/img/button.png) 0 0 0 0 stretch stretch; }" 
    "QPushButton:checked { border-image: url(:/img/button_checked.png) 0 0 0 0 stretch stretch; }" 
    "QPushButton:pressed { border-image: url(:/img/button_pressed.png) 0 0 0 0 stretch stretch; }" 
    "QPushButton:checked:pressed { border-image: url(:/img/button_checked_pressed.png) 0 0 0 0 stretch stretch; }" 
    ); 

tôi đã sử dụng border-image thay vì background-image do a deficiency trong style sheets Qt.

Làm cách nào tôi có thể có thang tỷ lệ mượt mà hơn với hình ảnh được sử dụng trong biểu định kiểu?

Thực hiện điều tương tự với hình thu nhỏ kém thanh lịch hơn nhiều. Tôi sẽ phải luôn luôn nắm bắt các sự kiện thay đổi kích thước, tính lại kích thước mới của tất cả các tiện ích của tôi và vẽ lại chúng theo cách thủ công.

Edit:

Điều thú vị là, mở rộng quy mô mịn làm việc với stylesheets nếu hình ảnh đang được mở rộng, nhưng không phải khi nó được co.

Trong ví dụ sau, trong hàng đầu tiên, một biểu tượng 32 * 32 được sử dụng và ở hàng thứ hai, lưới thống nhất lớn hơn 2000 * 2000.

example

+1

Tôi đã làm ví dụ: [example] (http://i.imgur.com/Qz79kXP.png). Phía bên trái là cách tiếp cận QPushButton StyleSheet của bạn. Phần giữa là QPixmap với _SmoothTransformation_ và cái bên phải là QPixmap khác với _FastTransformation_. Hình ảnh mũi tên ban đầu là hình ảnh 128x128. Theo như tôi có thể thấy trong ví dụ của tôi, cách tiếp cận của bạn dường như có quy mô nhỏ trong hình ảnh. Có lẽ tôi đang thiếu cái gì đó. – jgorosdev

+0

@jgorosdev: Thật thú vị, việc chia tỷ lệ mịn được sử dụng khi mở rộng hình ảnh, nhưng không phải khi làm cho nó nhỏ hơn. – vsz

Trả lời

1

Bên trong, Qt sử dụng QPainter để rút ra những phong cách, và QPainter sử dụng nội suy Bilinear khi vẽ pixmaps thu nhỏ lại. Điều này có một nhược điểm lớn từ góc độ chất lượng khi yếu tố giảm tỷ lệ đủ nhỏ, xem ví dụ this bug report. Để có chất lượng tốt nhất, hình ảnh nguồn nền phải luôn nằm trong hệ số [0.5, 2.0] của kích thước mục tiêu. AFAICT không có cách nào dễ dàng trong giới hạn này.

Các vấn đề liên quan