Qt程序开机启动的怪现象————无法正常显示程序皮肤
2014-10-14 15:58
405 查看
事情很简单:最近公司项目在做即时通讯软件,类似QQ。该软件应该支持开机启动这样的常用功能。但是实际上开发该功能的时候碰到了个问题:开机启动程序无法正常加载皮肤文件。
这个问题让我头疼了很久啊。最终确定问题出现在程序的打包皮肤文件上。因为界面使用的是qt所以,皮肤等资源文件都是应该放在qrc文件中进行统一管理的。但是实际上该程序的资源文件却都是在外面的。这样的结果就是正常启动程序没有问题,开机启动就会加载不上皮肤文件。
下面就是我想到的解决方法:
方法一:修改qrc文件,将所有的资源文件都添加到qrc文件中进行管理。这样问题就应该能够解决。另外我找到了官方的style的具体使用方法,具体使用方式和我说的基本一致。
方法二(我师父想出来的):修改程序运行时的所在目录。这个不太好理解。大概是windows启动的时候,程序虽然启动了,但是程序所在的文件夹却没有被识别,导致开机启动无法正常加载皮肤资源的等文件。具体解决办法就是在程序的main函数中设置程序所在目录。请看代码选段:
使用SetCurrentDirectoryA(strCurrentProcessPath.c_str() );就完成了程序所在目录的设置工作。
*注:
参考:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365530%28v=vs.85%29.aspx
这个问题让我头疼了很久啊。最终确定问题出现在程序的打包皮肤文件上。因为界面使用的是qt所以,皮肤等资源文件都是应该放在qrc文件中进行统一管理的。但是实际上该程序的资源文件却都是在外面的。这样的结果就是正常启动程序没有问题,开机启动就会加载不上皮肤文件。
下面就是我想到的解决方法:
方法一:修改qrc文件,将所有的资源文件都添加到qrc文件中进行管理。这样问题就应该能够解决。另外我找到了官方的style的具体使用方法,具体使用方式和我说的基本一致。
方法二(我师父想出来的):修改程序运行时的所在目录。这个不太好理解。大概是windows启动的时候,程序虽然启动了,但是程序所在的文件夹却没有被识别,导致开机启动无法正常加载皮肤资源的等文件。具体解决办法就是在程序的main函数中设置程序所在目录。请看代码选段:
//获取当前exe文件所在路径 std::string get_app_run_path() { char szFilePath[MAX_PATH + 1]; GetModuleFileNameA(NULL, szFilePath, MAX_PATH); (strrchr(szFilePath, ('\\')))[1] = 0;//删除文件名,只获得路径 return std::string(szFilePath); } bool GetCurrentProcessDirectory(std::wstring &wstrCurrentProcessPath) { bool is_success = false; do { WCHAR *lpProcessPath = (WCHAR* )malloc(sizeof(WCHAR)*MAX_PATH); if (lpProcessPath) { ZeroMemory(lpProcessPath, MAX_PATH); DWORD nBufferLength = MAX_PATH; is_success = GetCurrentDirectory(nBufferLength, lpProcessPath); wstrCurrentProcessPath = lpProcessPath; free(lpProcessPath); lpProcessPath = NULL; } } while (false); return is_success; } int main(int argc,char**argv) { std::wstring wstrCurrentProcessPath; GetCurrentProcessDirectory(wstrCurrentProcessPath); std::string strCurrentProcessPath = get_app_run_path(); SetCurrentDirectoryA(strCurrentProcessPath.c_str() ); 。。。 QApplication a(argc,argv); QFile file(QString( "../qss/gocomUi.qss") ); file.open( QFile::ReadOnly ); QString styleSheet = QLatin1String( file.readAll() ); file.close(); a.setStyleSheet( styleSheet ); a.setStyle(new CProxyStyle);//去除焦点虚框 mainWindow w; w.show(); 。。。 int rt = a.exec(); return rt; }
使用SetCurrentDirectoryA(strCurrentProcessPath.c_str() );就完成了程序所在目录的设置工作。
*注:
SetCurrentDirectory function
Changes the current directory for the current process.参考:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365530%28v=vs.85%29.aspx
相关文章推荐
- asp.net程序控件显示不正常,HTML编辑器无法显示,表格等页面元素也有异常现象
- qt在windows下编译好的QT程序在其他没有安装QT的机器上会出现图标和图片无法正常显示的问题。
- 调试opencv程序显示应用程序无法正常启动,0xc000007b
- 编译好的QT程序在其他没有安装QT的机器上会出现图标和图片无法正常显示的问题。
- QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法
- 开机后显示无法定位程序输入点于动态链接上(定位程序输入点_except_handler4_common于动态链接msvcrt.dll上)
- C# winForm程序开机启动和托盘显示
- QT编写Windows开机启动程序
- 发布的Qt程序如何才能正常显示图片
- C# winForm程序开机启动和托盘显示
- Qt实现程序开机启动
- 在使用GLSL程序时出现:应用程序无法正常启动0xc000007b
- 关于使用了QtWebKit的PyQt程序打包后无法显示网页图片的问题(Mac0S和windows)
- C# winForm程序开机启动和托盘显示
- MFC移植到WIN764位产生“程序无法正常启动, 0xC000007b”错误
- WIn7修复开机引导解决无法正常启动
- 对话框程序,点显示桌面按钮,在恢复对话框,多次重复有内存泄露。对话框再弹出会消耗一些内存,是正常现象
- 启动SQL 2005的SQL Server Configuration Manager时显示无法连接到WMI提供程序
- Qt程序在运行的目标机上Gif等格式的图片无法显示问题
- 夏新N800不能正常启动了,只显示夏新那个开机界面!不能进入系统