2011-11-03 37 views
6

Tôi sử dụng QPainter::setRenderHint(QPainter::Antialiasing, true) để nói với Qt rằng tôi muốn nó chống răng cưa bất kỳ bản vẽ nào tôi làm (trong trường hợp này, văn bản được vẽ bằng drawText()).QPainter :: xoay vô hiệu hóa khử răng cưa của văn bản được rút ra

Điều này hoạt động tốt và văn bản có vẻ tốt, cho đến khi tôi muốn xoay bản đồ hình ảnh tôi đang vẽ, ví dụ:

Painter.translate(0, height()); 
Painter.rotate(-90); 

(để xoay QPainter 90 độ ngược chiều kim đồng và đưa nó trở lại vào xem)

Các cuộc gọi đến rotate() dường như vô hiệu hóa khử răng cưa cho bất kỳ văn bản vẽ - văn bản được rút ra tại vòng xoay đúng nhưng không khử răng cưa . Những thứ khác dường như không bị ảnh hưởng - ví dụ: drawLine() vẫn vẽ một đường chống răng cưa độc đáo.

Bất kỳ ý tưởng nào tôi đang làm sai?

EDIT: Không có gì ngạc nhiên khi thêm văn bản vào đường dẫn và sau đó điền đường dẫn đó mang lại cho tôi văn bản được xoay vòng, chống răng cưa. Tôi muốn tránh con đường này nếu có thể.

EDIT (lại): Tôi đã thử sử dụng QFont::setStyleStrategy(QFont::PreferAntialias) trên phông chữ tôi đang sử dụng, không có hiệu lực. Tuy nhiên, một số thử nghiệm khác cho thấy rằng một phông chữ cơ bản như Arial sẽ vẫn tạo ra văn bản chống răng cưa khi xoay, trong khi phông chữ tùy chỉnh của tôi (Swiss721 BlkCn BT cho bất kỳ ai quan tâm) sẽ không. Hơn nữa, trong khi vấn đề này tồn tại trên Windows 7, tôi không có vấn đề tương tự khi chạy trên Ubuntu. This FAQ article dường như gợi ý rằng Qt tìm đến hệ điều hành máy chủ để xử lý chống răng cưa phông chữ, vậy Windows có thể gặp phải vấn đề gì trong việc xử lý hiển thị phông chữ cụ thể này (đó là TrueType, giống như Arial)?

EDIT (lần trước, tôi hứa): Tăng kích thước phông chữ lên 16pt hoặc cao hơn sẽ làm giảm sự cố. Có vẻ như vấn đề là bằng cách hiển thị phông chữ cụ thể của tôi bên dưới 16pt - có lẽ điều gì đó liên quan đến những gì được đề cập trong bài viết trên blog ?:

Trên phông Windows 2000 thường không được chống răng cưa trong một phạm vi nhất định (nói kích thước 8-16) để làm cho văn bản sắc nét và dễ đọc hơn.

+0

Tôi nghĩ rằng tôi có thể đã trả lời câu hỏi của riêng mình ở đây, nhưng nếu có ai có thêm thông tin hoặc liên quan thì tôi vẫn rất quan tâm. – sjwarner

Trả lời

2

Tôi đã thực sự đã có dịp được trong phần này của mã Qt thời gian gần đây, và tôi nghĩ rằng hành vi mà bạn đang nhìn thấy có liên quan đến hai lỗi sau đây trong Qt:

Nếu tôi nhớ chính xác (không chắc chắn 100%), những gì bạn thực sự thấy là mất hiển thị ClearType trên Windows. Khi có một phép biến đổi được áp dụng, Qt nhận được các điểm ảnh glyph theo cách mà đưa ra thông tin ClearType, vì vậy mọi thứ trông lởm chởm hơn.

Nếu bạn muốn tự mình xem mã, nơi có nhiều khả năng nhất là /src/gui/text/qfontengine_win.cpp. Bạn cũng có thể thử tắt ClearType và xem chúng có giống nhau hay không.

+1

Điều đó làm cho rất nhiều ý nghĩa Dave, cảm ơn bạn. Tắt cleartype thực sự dẫn đến các ký tự được vẽ với các pixel giống nhau khi xoay. [Chủ đề của diễn đàn] (http://forum.xda-developers.com/archive/index.php/t-280037.html) (đặc biệt là các bình luận của Ingvarr) cũng như [bài viết Wikipedia] (http://en.wikipedia.org/wiki/Cleartype#How_ClearType_works) giải thích nguyên tắc cơ bản làm cho công việc ClearType cũng giới hạn nó như thế nào để chỉ làm việc với văn bản nằm ngang. – sjwarner

0

Một "phỏng đoán" liên quan đến RenderHint của bạn. Bạn sử dụng QPainter::Antialiasing tại đây. Docu: "Chỉ ra rằng động cơ nên cạnh antialias của nguyên thủy nếu có thể." Nguyên thủy như đường thẳng, đường viền, v.v. Thay vào đó, hãy thử QPainter::TextAntialiasing.

Lưu ý: RenderHints là cờ, vì vậy bạn có thể bit-HOẶC chúng nếu cần (và âm thanh như nó là).

+0

Không may mắn là tôi sợ Robin, dù sao cũng được. – sjwarner

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