1、演示效果
2、关键程序
#include "QtAwesome.h"
#include "QtAwesomeAnim.h"
#include <QDebug>
#include <QFile>
#include <QFontDatabase>
class QtAwesomeCharIconPainter: public QtAwesomeIconPainter
{
protected:
QStringList optionKeysForModeAndState( const QString& key, QIcon::Mode mode, QIcon::State state)
{
QString modePostfix;
switch(mode) {
case QIcon::Disabled:
modePostfix = "-disabled";
break;
case QIcon::Active:
modePostfix = "-active";
break;
case QIcon::Selected:
modePostfix = "-selected";
break;
default: // QIcon::Normal:
// modePostfix = "";
break;
}
QString statePostfix;
if( state == QIcon::Off) {
statePostfix = "-off";
}
QStringList result;
if( !modePostfix.isEmpty() ) {
if( !statePostfix.isEmpty() ) {
result.push_back( key + modePostfix + statePostfix );
}
result.push_back( key + modePostfix );
}
if( !statePostfix.isEmpty() ) {
result.push_back( key + statePostfix );
}
return result;
}
QVariant optionValueForModeAndState( const QString& baseKey, QIcon::Mode mode, QIcon::State state, const QVariantMap& options )
{
foreach( QString key, optionKeysForModeAndState(baseKey, mode, state) ) {
//if ( options.contains(key) && options.value(key).toString().isEmpty()) qDebug() << "Not found:" << key;
if( options.contains(key) && !(options.value(key).toString().isEmpty()) )
return options.value(key);
}
return options.value(baseKey);
}
public:
virtual void paint( QtAwesome* awesome, QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state, const QVariantMap& options )
{
painter->save();
QVariant var =options.value("anim");
QtAwesomeAnimation* anim = var.value<QtAwesomeAnimation*>();
if( anim ) {
anim->setup( *painter, rect );
}
QColor color = optionValueForModeAndState("color", mode, state, options).value<QColor>();
QString text = optionValueForModeAndState("text", mode, state, options).toString();
Q_ASSERT(color.isValid());
Q_ASSERT(!text.isEmpty());
painter->setPen(color);
int drawSize = qRound(rect.height()*options.value("scale-factor").toFloat());
painter->setFont( awesome->font(drawSize) );
painter->drawText( rect, text, QTextOption( Qt::AlignCenter|Qt::AlignVCenter ) );
painter->restore();
}
};
class QtAwesomeIconPainterIconEngine : public QIconEngine
{
public:
QtAwesomeIconPainterIconEngine( QtAwesome* awesome, QtAwesomeIconPainter* painter, const QVariantMap& options )
: awesomeRef_(awesome)
, iconPainterRef_(painter)
, options_(options)
{
}
virtual ~QtAwesomeIconPainterIconEngine() {}
QtAwesomeIconPainterIconEngine* clone() const
{
return new QtAwesomeIconPainterIconEngine( awesomeRef_, iconPainterRef_, options_ );
}
virtual void paint(QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state)
{
Q_UNUSED( mode );
Q_UNUSED( state );
iconPainterRef_->paint( awesomeRef_, painter, rect, mode, state, options_ );
}
virtual QPixmap pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state)
{
QPixmap pm(size);
pm.fill( Qt::transparent ); // we need transparency
{
QPainter p(&pm);
paint(&p, QRect(QPoint(0,0),size), mode, state);
}
return pm;
}
private:
QtAwesome* awesomeRef_; ///< a reference to the QtAwesome instance
QtAwesomeIconPainter* iconPainterRef_; ///< a reference to the icon painter
QVariantMap options_; ///< the options for this icon painter
};
QtAwesome::QtAwesome( QObject* parent )
: QObject( parent )
, namedCodepoints_()
{
setDefaultOption( "color", QColor(50,50,50) );
setDefaultOption( "color-disabled", QColor(70,70,70,60));
setDefaultOption( "color-active", QColor(10,10,10));
setDefaultOption( "color-selected", QColor(10,10,10));
setDefaultOption( "scale-factor", 0.9 );
setDefaultOption( "text", QVariant() );
setDefaultOption( "text-disabled", QVariant() );
setDefaultOption( "text-active", QVariant() );
setDefaultOption( "text-selected", QVariant() );
fontIconPainter_ = new QtAwesomeCharIconPainter();
}
QtAwesome::~QtAwesome()
{
delete fontIconPainter_;
qDeleteAll(painterMap_);
}
void QtAwesome::init(const QString& fontname)
{
fontName_ = fontname;
}
bool QtAwesome::initFontAwesome( )
{
static int fontAwesomeFontId = -1;
if( fontAwesomeFontId < 0 ) {
Q_INIT_RESOURCE(QtAwesome);
QFile res(":/fonts/fontawesome-4.7.0.ttf");
if(!res.open(QIODevice::ReadOnly)) {
qDebug() << "Font awesome font could not be loaded!";
return false;
}
QByteArray fontData( res.readAll() );
res.close();
fontAwesomeFontId = QFontDatabase::addApplicationFontFromData(fontData);
}
QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(fontAwesomeFontId);
if( !loadedFontFamilies.empty() ) {
fontName_= loadedFontFamilies.at(0);
} else {
qDebug() << "Font awesome font is empty?!";
fontAwesomeFontId = -1;
return false;
}
QHash<QString, int>& m = namedCodepoints_;
for (unsigned i = 0; i < sizeof(faNameIconArray)/sizeof(FANameIcon); ++i) {
m.insert(faNameIconArray[i].name, faNameIconArray[i].icon);
}
return true;
}
void QtAwesome::addNamedCodepoint( const QString& name, int codePoint)
{
namedCodepoints_.insert( name, codePoint);
}
void QtAwesome::setDefaultOption(const QString& name, const QVariant& value)
{
defaultOptions_.insert( name, value );
}
QVariant QtAwesome::defaultOption(const QString& name)
{
return defaultOptions_.value( name );
}
static QVariantMap mergeOptions( const QVariantMap& defaults, const QVariantMap& override )
{
QVariantMap result= defaults;
if( !override.isEmpty() ) {
QMapIterator<QString,QVariant> itr(override);
while( itr.hasNext() ) {
itr.next();
result.insert( itr.key(), itr.value() );
}
}
return result;
}
QIcon QtAwesome::icon(int character, const QVariantMap &options)
{
QVariantMap optionMap = mergeOptions( defaultOptions_, options );
optionMap.insert("text", QString( QChar(static_cast<int>(character)) ) );
return icon( fontIconPainter_, optionMap );
}
QIcon QtAwesome::icon(const QString& name, const QVariantMap& options)
{
if( namedCodepoints_.count(name) ) {
return icon( namedCodepoints_.value(name), options );
}
QVariantMap optionMap = mergeOptions( defaultOptions_, options );
QtAwesomeIconPainter* painter = painterMap_.value(name);
if( !painter ) {
return QIcon();
}
return icon( painter, optionMap );
}
QIcon QtAwesome::icon(QtAwesomeIconPainter* painter, const QVariantMap& optionMap )
{
QtAwesomeIconPainterIconEngine* engine = new QtAwesomeIconPainterIconEngine( this, painter, optionMap );
return QIcon( engine );
}
void QtAwesome::give(const QString& name, QtAwesomeIconPainter* painter)
{
delete painterMap_.value( name ); // delete the old one
painterMap_.insert( name, painter );
}
QFont QtAwesome::font( int size )
{
QFont font( fontName_);
font.setPixelSize(size);
return font;
}
3、显示过程
/**
* MIT Licensed
*
* Copyright 2011-2015 - Reliable Bits Software by Blommers IT. All Rights Reserved.
* Author Rick Blommers
*/
#include "QtAwesome.h"
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QLabel>
#include <QTableWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow w;
QtAwesome* awesome = new QtAwesome(&w);
awesome->initFontAwesome();
QVBoxLayout* layout = new QVBoxLayout();
w.setWindowTitle(u8"图标总览");
w.setWindowIcon(awesome->icon(faNameIconArray[0].icon, QVariantMap()));
QTableWidget *pTable = new QTableWidget();
pTable->clear();
pTable->setRowCount(54);
pTable->setColumnCount(15);
pTable->setMinimumSize(1598, 500);
pTable->setIconSize(QSize(18, 18));
int nCount = sizeof(faNameIconArray) / sizeof(faNameIconArray[0]);
int IconIndex = 0;
for (int row = 0; row < pTable->rowCount(); row++)
{
for (int col = 0; col < pTable->columnCount(); col++)
{
QString strName = "";
if (IconIndex < nCount)
strName = QString("%1").arg(QString::fromStdString(faNameIconArray[IconIndex].name));
else
continue;
auto icon = faNameIconArray[IconIndex].icon;
QTableWidgetItem *pItem = new QTableWidgetItem(strName);
QVariantMap options;
pItem->setIcon(awesome->icon(icon, options));
pTable->setItem(row, col, pItem);
IconIndex++;
}
}
layout->addWidget(pTable);
QWidget* samples = new QWidget();
samples->setLayout(layout);
w.setCentralWidget(samples);
w.show();
return app.exec();
}
4、程序链接
https://download.csdn.net/download/u013083044/85476836
打赏