返回介绍

Font Displayer

发布于 2019-10-04 15:00:13 字数 6728 浏览 784 评论 0 收藏 0

This example program displays all characters of a font.


Header file:

/****************************************************************************
** $Id:  qt/fontdisplayer.h   3.0.5   edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#ifndef FontDisplayer_H
#define FontDisplayer_H

#include <qframe.h>
#include <qmainwindow.h>

class QSlider;

class FontRowTable : public QFrame {
    Q_OBJECT
public:
    FontRowTable( QWidget* parent=0, const char* name=0 );

    QSize sizeHint() const;

signals:
    void fontInformation(const QString&);

public slots:
    void setRow(int);
    void chooseFont();


protected:
    QSize cellSize() const;
    void paintEvent( QPaintEvent* );
private:
    QFont tablefont;
    int row;
};

class FontDisplayer : public QMainWindow {
    Q_OBJECT
public:
    FontDisplayer( QWidget* parent=0, const char* name=0 );
};

#endif


Implementation:

/****************************************************************************
** $Id:  qt/fontdisplayer.cpp   3.0.5   edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#include "fontdisplayer.h"
#include <qapplication.h>
#include <qslider.h>
#include <qspinbox.h>
#include <qpainter.h>
#include <qtoolbar.h>
#include <qstatusbar.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qfontdialog.h>
#include <stdlib.h>


FontRowTable::FontRowTable( QWidget* parent, const char* name ) :
    QFrame(parent,name)
{
    setBackgroundMode(PaletteBase);
    setFrameStyle(Panel|Sunken);
    setMargin(8);
    setRow(0);
    tablefont = QApplication::font();
}

QSize FontRowTable::sizeHint() const
{
    return 16*cellSize()+QSize(2,2)*(margin()+frameWidth());
}

QSize FontRowTable::cellSize() const
{
    QFontMetrics fm = fontMetrics();
    return QSize( fm.maxWidth(), fm.lineSpacing()+1 );
}

void FontRowTable::paintEvent( QPaintEvent* e )
{
    QFrame::paintEvent(e);
    QPainter p(this);
    p.setClipRegion(e->region());
    QRect r = e->rect();
    QFontMetrics fm = fontMetrics();
    int ml = frameWidth()+margin() + 1 + QMAX(0,-fm.minLeftBearing());
    int mt = frameWidth()+margin();
    QSize cell((width()-15-ml)/16,(height()-15-mt)/16);

    if ( !cell.width() || !cell.height() )
        return;

    int mini = r.left() / cell.width();
    int maxi = (r.right()+cell.width()-1) / cell.width();
    int minj = r.top() / cell.height();
    int maxj = (r.bottom()+cell.height()-1) / cell.height();

    int h = fm.height();

    QColor body(255,255,192);
    QColor negative(255,192,192);
    QColor positive(192,192,255);
    QColor rnegative(255,128,128);
    QColor rpositive(128,128,255);

    for (int j = minj; j<=maxj; j++) {
        for (int i = mini; i<=maxi; i++) {
            if ( i < 16 && j < 16 ) {
                int x = i*cell.width();
                int y = j*cell.height();

                QChar ch = QChar(j*16+i,row);

                if ( fm.inFont(ch) ) {
                    int w = fm.width(ch);
                    int l = fm.leftBearing(ch);
                    int r = fm.rightBearing(ch);

                    x += ml;
                    y += mt+h;

                    p.fillRect(x,y,w,-h,body);
                    if ( w ) {
                        if ( l ) {
                            p.fillRect(x+(l>0?0:l), y-h/2, abs(l),-h/2,
                                       l < 0 ? negative : positive);
                        }
                        if ( r ) {
                            p.fillRect(x+w-(r>0?r:0),y+2, abs(r),-h/2,
                                       r < 0 ? rnegative : rpositive);
                        }
                    }
                    QString s;
                    s += ch;
                    p.setPen(QPen(Qt::black));
                    p.drawText(x,y,s);
                }
            }
        }
    }
}

void FontRowTable::setRow(int r)
{
    row = r;

    QFontMetrics fm = fontMetrics();
    QString str;
    str.sprintf("mLB=%d mRB=%d mW=%d",
        fm.minLeftBearing(),
        fm.minRightBearing(),
        fm.maxWidth()
        );

    emit fontInformation(str);
    update();
}

void FontRowTable::chooseFont()
{
    bool ok;
    QFont oldfont = tablefont;
    tablefont = QFontDialog::getFont(&ok, oldfont, this);

    if (ok)
        setFont(tablefont);
    else
        tablefont = oldfont;


}

FontDisplayer::FontDisplayer( QWidget* parent, const char* name ) :
    QMainWindow(parent,name)
{
    FontRowTable* table = new FontRowTable(this);
    QToolBar* controls = new QToolBar(this);
    (void) new QLabel(tr("Row:"), controls);
    QSpinBox *row = new QSpinBox(0,255,1,controls);
    controls->addSeparator();
    QPushButton *fontbutton = new QPushButton(tr("Font..."), controls);

    connect(row,SIGNAL(valueChanged(int)),table,SLOT(setRow(int)));
    connect(fontbutton, SIGNAL(clicked()), table, SLOT(chooseFont()));
    connect(table,SIGNAL(fontInformation(const QString&)),
            statusBar(),SLOT(message(const QString&)));
    table->setRow(0);
    setCentralWidget(table);
}


Main:

/****************************************************************************
** $Id:  qt/qfd.cpp   3.0.5   edited Oct 12 2001 $
**
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
** This file is part of an example program for Qt.  This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/

#include "fontdisplayer.h"

#include <qapplication.h>
#include <qslider.h>
#include <qpainter.h>
#include <qstatusbar.h>



int main(int argc, char** argv)
{
    // Use an interesting font
    QApplication::setFont(QFont("unifont",16));

    QApplication app(argc,argv);

    FontDisplayer m;
    QSize sh = m.centralWidget()->sizeHint();
    m.resize(sh.width(),
             sh.height()+3*m.statusBar()->height());
    app.setMainWidget(&m);
    m.setCaption("Qt Example - QFD");
    m.show();

    return app.exec();
}

See also Examples.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文