Why the string on model of table view will be changed after adding application font.



  • I set the font in the model of QTableView in data()

    QFont font("Sans Serif", 12, QFont::Normal, true);
            switch (index.column()) {
            case 0:
                return QVariant();
                break;
            case 1:
                return font;
                break;
            default:
                return QVariant();
                break;
    

    but when I QFontDatabase::addApplicationFont() a new font by myself, all the strings of the column has been set font are changed to squares. This phenomenon only appears on Arm. What should I do?


  • Lifetime Qt Champion

    Hi
    Sounds like something wrong with font.
    Try testing if it really is added after calling QFontDatabase::addApplicationFont()

    QFontDatabase fdb;
    QStringList fam = fdb.families();
    
        qDebug() << "QFontDatabase::Any: available font families -> " << fam.count();
        for (int i = 0 ; i < fam.count() ; i++)
        {
                qDebug() << fam[i];
        }
    }
    

  • Lifetime Qt Champion

    Hi,

    To add to @mrjj, did you deploy the font on the device ? Or are you embedding it in the application through Qt's resources system ?



  • @sgaist Hi,
    I add AwesomeFont in the vritual keyboard I made, the vritual keyboard is a plugin. When it is shown, it will add the font in resource

        m_FontId = QFontDatabase::addApplicationFont(":/font/FontAwesome.otf");
        QString fontName = QFontDatabase::applicationFontFamilies(m_FontId).at(0);
        QFont iconFont(fontName);
        iconFont.setPixelSize(20);
    

    At the same time, the string of table in main project will be changed to be squares. Also, if I don't set the font in data() of table model, this phenomenon will not happen.



  • @mrjj Hi,
    I'm sure it was added successfully. But it is added in plugin.

    Also, I try adding this font in main()of the project but do not use it, This phenomenon appears.



  • @sgaist @mrjj
    Thank you so much.
    I found there are only two fonts except I added in the system .

    QFontDatabase::Any: available font families ->  3
    "FontAwesome"
    "WenQuanYi Micro Hei"
    "WenQuanYi Micro Hei Mono"
    

    So when I set font to be "Sans Serif". It can't find this font and will use the first font of family default, "WenQuanYi Micro Hei". And when I add Awesome font, the font of string in the table I had set will be "WenQuanYi Micro Hei" -> "FontAwesome" .
    So I should add "Sans Serif" in the system or modify QFont font("Sans Serif", 12, QFont::Normal, true); -> QFont font("WenQuanYi Micro Hei", 12, QFont::Normal, true);

    Is that right? Or can I know which font the system use default?



  • @mrjj @SGaist
    Hi
    I found the project's default font is "Sans Serif" not "WenQuanYi Micro Hei".
    But I set the font in data(),

    QFont font = QApplication::font();
    

    it's still will be changed when I add a font.

    Could you please explain?


  • Lifetime Qt Champion

    Can your create a minimal compilable example that reproduces this ?

    By the way, which version of Qt are young using ?
    On which platform ?



  • @sgaist
    Sure. Here's an example. When you click the button ,it will add the font, then you should touch the table to make it updated , and you can see the phenomenon. If you don't add font, the phenomenon will not appear.

    I'm using Qt5.5.0 for linux, Qt5.6.2 for Arm-linux. This phenomenon only appears on Arm-linux. The arm-linux system has only two font

    uh....."you do not have enough privileges for this action.", I can't upload file. So....

    #mainwindows.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QDebug>
    #include <QStringList>
    #include <QApplication>
    #include <QFontDatabase>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    
        InitTableModel();
        ConnectSlots();
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::InitTableModel()
    {
        TestModel *model = new TestModel;
        ui->tableView->setModel(model);
    }
    
    void MainWindow::ConnectSlots()
    {
        connect(ui->CteateBtn,SIGNAL(clicked(bool)),this,SLOT(CreateFont()));
    }
    
    void MainWindow::CreateFont()
    {
        qDebug()<<"add awesome font";
        QFontDatabase::addApplicationFont(":/new/prefix1/FontAwesome.otf");
    }
    
    
    TestModel::TestModel(QObject *parent):
        QAbstractTableModel(parent)
    {
        m_String.clear();
        m_String<<"test1"<<"test2"<<"test3"<<"test4"<<"test5"<<"test6"<<"test7";
    }
    
    TestModel::~TestModel()
    {
    
    }
    
    int TestModel::columnCount(const QModelIndex &parent) const
    {
        return 2;
    }
    
    int TestModel::rowCount(const QModelIndex &parent) const
    {
        return m_String.count();
    }
    
    QVariant TestModel::data(const QModelIndex &index, int role) const
    {
        if(!index.isValid())
               return QVariant();
        if(role == Qt::DisplayRole)
        {
            return m_String.at(index.row());
        }
        else if(role == Qt::FontRole)
        {
            QFont font = QApplication::font();
            font.setItalic(true);
            switch (index.column()) {
            case 0:
                return QVariant();
                break;
            case 1:
                return font;
                break;
            default:
                return QVariant();
                break;
            }
        }
        else
            return QVariant();
    }
    
    #mainwindow.h
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QAbstractTableModel>
    
    namespace Ui {
    class MainWindow;
    class TestModel;
    }
    
    class TestModel : public QAbstractTableModel
    {
        Q_OBJECT
    public:
        explicit TestModel(QObject *parent = 0);
        ~TestModel();
    
        int columnCount(const QModelIndex &parent = QModelIndex()) const;
        int rowCount(const QModelIndex &parent = QModelIndex()) const;
        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    
    private:
        QStringList m_String;
    };
    
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        void InitTableModel();
        void ConnectSlots();
    
    public slots:
        void CreateFont();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    
    

    There is a TableView and a Pushbutton in ui(mainwindow.ui)


  • Lifetime Qt Champion

    Then please, add the content of the UI file to that post.



  • @sgaist sorry I forgot it.

    #mainwindow.ui
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>344</width>
        <height>469</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <layout class="QGridLayout" name="gridLayout">
        <item row="0" column="0">
         <widget class="QTableView" name="tableView">
          <attribute name="horizontalHeaderVisible">
           <bool>false</bool>
          </attribute>
          <attribute name="verticalHeaderVisible">
           <bool>false</bool>
          </attribute>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QPushButton" name="CteateBtn">
          <property name="text">
           <string>Create Font</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    
    #main.cpp
    
    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    
    # .pro
    
    #-------------------------------------------------
    #
    # Project created by QtCreator 2019-08-15T08:51:22
    #
    #-------------------------------------------------
    
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = FontTest
    TEMPLATE = app
    
    
    SOURCES += main.cpp\
            mainwindow.cpp
    
    HEADERS  += mainwindow.h
    
    FORMS    += mainwindow.ui
    
    RESOURCES += \
        font.qrc
    

  • Lifetime Qt Champion

    What is the content of font.qrc ?
    Depending on that, where do you get the corresponding file(s) ?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.