Qt实战--从main开始

Qt作为C/C++框架库,入口函数自然还是main,不像MFC那样隐藏了main,搞得人云里雾里。
我们就从main开始,开启Qt之旅。

main函数源码

int main(int argc, char *argv[])
{
    qInstallMessageHandler(myLogHandler);

    qInfo("-------------------app start----------------------------------");
    QApplication a(argc, argv);
    a.setApplicationName(APP_NAME);

    setFont(DEFAULT_FONT_SIZE);
    loadSkin(DEFAULT_SKIN);
    setPalette(DEFAULT_PALETTE_COLOR);
    loadLang(DEFAULT_LANGUAGE);

    // note: we use image.qrc
    // rcloader->loadIcon();

    g_mainwnd->showMaximized();

    int retcode = a.exec();

    MainWindow::exitInstance();
    return retcode;
}

流程

代码很简单,流程一目了然。

安装日志处理器 => 定义应用程序对象 => 设置字体、面板颜色、皮肤、语言等 => 创建主窗口 => 显示 => 事件循环

可以发现这和WIN32窗口流程很相似,注册窗口 => 创建窗口 => 显示窗口 => 窗口消息循环。
Qt也不过是封装了一下这个流程,提供了更为方便的跨平台的API接口。
此为Qt提供了qrc资源加载机制,所以我们也不用自己加载图片资源了。

主要函数

日志处理器

FILE* g_loggerfp = NULL;
#define LOG_LEVEL   0

void myLogHandler(QtMsgType type, const QMessageLogContext & ctx, const QString & msg){
    // QtDebugMsg = 0
    // QtInfoMsg = 4
    if (type < LOG_LEVEL)
        return;

    char szType[16];
    switch (type) {
    case QtDebugMsg:
        strcpy(szType, "Debug");
        break;
    case QtInfoMsg:
        strcpy(szType, "Info");
        break;
    case QtWarningMsg:
        strcpy(szType, "Warning");
        break;
    case QtCriticalMsg:
        strcpy(szType, "Critical");
        break;
    case QtFatalMsg:
        strcpy(szType, "Fatal");
    }

    QString strLog = QString::asprintf("[%s] [%s]:%s [%s:%d-%s]\n",
                                       QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toLocal8Bit().data(),
                                       szType,
                                       msg.toLocal8Bit().data(),
                                       ctx.file,ctx.line,ctx.function);


    QString strLogFilePath = "qt.log";

    if (!g_loggerfp){
        g_loggerfp = fopen(strLogFilePath.toLocal8Bit().data(), "a");
    }

    if (g_loggerfp){
        fseek(g_loggerfp, 0, SEEK_END);
        if (ftell(g_loggerfp) > (2 << 20)){
            fclose(g_loggerfp);
            g_loggerfp = fopen(strLogFilePath.toLocal8Bit().data(), "w");
        }
    }

    if (g_loggerfp){
        fputs(strLog.toLocal8Bit().data(), g_loggerfp);
    }
}

日志记录下了时间、类别、消息、文件、行数、函数名

加载皮肤

inline void loadSkin(const char *qss){
    QFile file(qss);
    if (file.open(QFile::ReadOnly)){
        qApp->setStyleSheet(file.readAll());
        file.close();
    }
}

Qt提供了qss样式表机制,我们只需要以类似css语言制作自己的qss文件,就可以为应用程序界面定制各种皮肤了。
qss语法请在Qt助手中搜索Qt Style Sheets 。

加载语言

inline void loadLang(const char* qm){
    QTranslator *translator = new QTranslator(qApp);
    translator->load(qm);
    qApp->installTranslator(translator);
}

Qt使用.qm文件去翻译各国语言,在应用程序中我们使用tr()去包含我们需要翻译的文字,使用Qt语言家提供的lupdate和lrelease工具就可以生成.qm文件了。

不过加载语言只在界面创建前有效,不能实时切换语言,切换语言后需要重启应用程序才生效。
细心的朋友应该发现,QtCreator换肤和切换语言功能也是提示我们需要重启应用程序才生效。

关于 qss语法 和 qm文件如何生成的 有疑问的小伙伴,可以在评论区留言。

你可能感兴趣的:(Qt,Qt实战--多画面播放器)