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文件如何生成的 有疑问的小伙伴,可以在评论区留言。
更多推荐
所有评论(0)