2010-05-28 29 views
3

我正在創建一個模仿A4打印頁面的自定義Qt小部件,並且在正確尺寸下呈現字體時出現問題。我的小部件使用QPainter::setViewportQPainter::setWindow來模仿A4頁面,使用毫米的十分之一單位,這使我可以輕鬆繪製。但是,嘗試創建特定點大小的字體似乎不起作用,並且使用QFont:setPixelSize不準確。下面是一些代碼:所見即所得的Qt - 字體大小的困境

View::View(QWidget *parent) : 
    QWidget(parent), 
    printer(new QPrinter) 
{ 
    printer->setPaperSize(QPrinter::A4); 
    printer->setFullPage(true); 
} 

void View::paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 
    painter.setWindow(0, 0, 2100, 2970); 
    painter.setViewport(0, 0, printer->width(), printer->height()); 
    // Draw a rect at x = 1cm, y = 1cm, 6cm wide and 1 inch high 
    painter.drawRect(100, 100, 600, 254); 

    // Create a 72pt (1 inch) high font 
    QFont font("Arial"); 
    font.setPixelSize(254); 
    painter.setFont(font); 
    // Draw in the same box 
    // The font is too large 
    painter.drawText(QRect(100, 100, 600, 254), tr("Wg\u0102")); 
    // Ack - the actual font size reported by the metrics is 283 pixels! 
    const QFontMetrics fontMetrics = painter.fontMetrics(); 
    qDebug() << "Font height = " << fontMetrics.height(); 
} 

所以我要求一個254高的字體(1英寸,72分),它太大了。果然,當我通過QFontMetrics查詢字體高度是283高。

是否有其他人知道如何使用像這樣的自定義映射模式點字體大小?這一定是可能的。請注意,我看不出邏輯/設備點之間的任何轉換

編輯(即在Win32 DPtoLP/LPtoDP當量。):嗯,事實證明,我的代碼是做工精細畢竟。我將它轉換成與打印機一起工作,將其打印出來,然後使用各種文字處理程序打印相同的文本,結果完全相同。似乎要求字體大小不考慮下降,這似乎是常態。

+0

您是否正在製作一個字處理器類應用程序,因爲我希望看到您的一些代碼。我有興趣構建一個類似於應用程序的文字處理器,但我發現QTextEdit非常有限。 – 2017-05-09 18:16:20

回答

1

QFont可能會或可能不會匹配您請求的確切字體。 QFontMetrics::height()在我的系統上返回284的大小,但QFontInfo::pixelSize()返回所請求的大小254。我假設不同的是,height()包括下降,其中pixelSize()返回匹配字體的像素大小,這意味着我有一個匹配。

至於繪製,放置和轉換,您需要小心,因爲打印機設備將不會與屏幕設備相同,也不會與解決方案匹配。爲了進一步加劇問題,您無法在打印對話框中調用設置的情況下獲得確切的打印機指標。設備獨立性讓你接近所見即所得,但並不總是足夠接近。

在您的示例中,繪圖設備是this。因此,您可以通過logicalDpiX()logicalDpiY()函數(以及它們的物理等效項)獲得邏輯dpi。

+0

好吧,所以如果我使用setPixelSize和正確的上升,那麼我最終會得到一個字體,其中height()是正確的。問題是我如何找出事先提升的東西! – Rob 2010-05-28 21:49:41

+0

排版可能會限制上升/下降與字體大小成正比。如果是這樣,你應該抓住上升,下降和pixelSize兩個不同的目標尺寸,然後插入你需要的尺寸。我預計這會關閉至多兩個像素(每個上升和下降一個)。至少應該很容易測試。 – 2010-05-28 22:12:26