事情很简单:最近公司项目在做即时通讯软件,类似QQ。该软件应该支持开机启动这样的常用功能。但是实际上开发该功能的时候碰到了个问题:开机启动程序无法正常加载皮肤文件。

这个问题让我头疼了很久啊。最终确定问题出现在程序的打包皮肤文件上。因为界面使用的是qt所以,皮肤等资源文件都是应该放在qrc文件中进行统一管理的。但是实际上该程序的资源文件却都是在外面的。这样的结果就是正常启动程序没有问题,开机启动就会加载不上皮肤文件。

下面就是我想到的解决方法:

方法一:修改qrc文件,将所有的资源文件都添加到qrc文件中进行管理。这样问题就应该能够解决。另外我找到了官方的style的具体使用方法,具体使用方式和我说的基本一致。

方法二(我师父想出来的):修改程序运行时的所在目录。这个不太好理解。大概是windows启动的时候,程序虽然启动了,但是程序所在的文件夹却没有被识别,导致开机启动无法正常加载皮肤资源的等文件。具体解决办法就是在程序的main函数中设置程序所在目录。请看代码选段:

  1. //获取当前exe文件所在路径
  2. std::string get_app_run_path()
  3. {
  4. char szFilePath[MAX_PATH + ];
  5. GetModuleFileNameA(NULL, szFilePath, MAX_PATH);
  6. (strrchr(szFilePath, ('\\')))[] = ;//删除文件名,只获得路径
  7. return std::string(szFilePath);
  8. }
  9. bool GetCurrentProcessDirectory(std::wstring &wstrCurrentProcessPath)
  10. {
  11. bool is_success = false;
  12.  
  13. do
  14. {
  15. WCHAR *lpProcessPath = (WCHAR* )malloc(sizeof(WCHAR)*MAX_PATH);
  16. if (lpProcessPath)
  17. {
  18. ZeroMemory(lpProcessPath, MAX_PATH);
  19. DWORD nBufferLength = MAX_PATH;
  20. is_success = GetCurrentDirectory(nBufferLength, lpProcessPath);
  21. wstrCurrentProcessPath = lpProcessPath;
  22. free(lpProcessPath);
  23. lpProcessPath = NULL;
  24. }
  25.  
  26. } while (false);
  27.  
  28. return is_success;
  29. }
  30.  
  31. int main(int argc,char**argv)
  32. {
  33.  
  34. std::wstring wstrCurrentProcessPath;
  35. GetCurrentProcessDirectory(wstrCurrentProcessPath);
  36. std::string strCurrentProcessPath = get_app_run_path();
  37. SetCurrentDirectoryA(strCurrentProcessPath.c_str() );
  38. 。。。
  39.  
  40. QApplication a(argc,argv);
  41.  
  42. QFile file(QString( "../qss/gocomUi.qss") );
  43. file.open( QFile::ReadOnly );
  44. QString styleSheet = QLatin1String( file.readAll() );
  45. file.close();
  46.  
  47. a.setStyleSheet( styleSheet );
  48.  
  49. a.setStyle(new CProxyStyle);//去除焦点虚框
  50.  
  51. mainWindow w;
  52. w.show();
  53.  
  54. 。。。
  55. int rt = a.exec();
  56. return rt;
  57. }

使用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

Qt程序开机启动的怪现象————无法正常显示程序皮肤的更多相关文章

  1. CentOS程序 开机启动设置与chkconfig命令学习

    CentOS设置程序开机启动的方法: 1.启动命令添加到/etc/rc.d/rc.local 文件中, 如: vim /etc/rc.d/rc.local #!/bin/sh # # This scr ...

  2. CentOS设置程序开机启动程序/服务的方法(转)

    注意:CentOS 6下基本没什么问题,CentOS 7估计不一定能行. 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. 1.把启动程序的命令添加到/etc/rc.d/rc.loca ...

  3. ubuntu 设置qt程序开机启动

    1.建立一个桌面文件,forklift-app.desktop Name填写程序的名字 Exec执行程序的路径 [Desktop Entry] Version=1.0 Name=forklift-ap ...

  4. C# winForm程序开机启动和托盘显示 (转http://blog.csdn.net/xinyue3054/article/details/6599508)

    这段时间一直进行cs项目,故整理下开机自动运行.托盘.显示.隐藏. (1).在窗口上点击关闭按钮或者最小化时将托盘显示: (2).双击托盘图标显示窗口: (3).右键点击托盘图标提供三个菜单选项,“退 ...

  5. 在android系统上写C语言程序--开机启动该程序不进入安卓系统

    今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直 ...

  6. Golang 在 Linux CentOS 6.5 服务器上实现 博客后台程序开机启动

    在linux下想实现开机启动的方法很多,这里我采用了在/etc/rc.local里写shell指令的方式. 以下就以我的实际操作为例子讲述,很多地方需要看官自己调整信息哦! 1.在/etc/rc.lo ...

  7. CentOS配置jar应用程序开机启动的方法

    1.背景 某些java程序,我们需要开机,自动启动.... 2.实现步骤 2.1.编写程序启动脚本boot.sh #!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NA ...

  8. C#实现程序开机启动

    如何用c#实现开机启动?其实用c#实现程序的开机启动大致有两种方法,就是写入注册表或者采用服务程序,最近一直研究着用C#来操作注册表,下面介绍的方法便是用注册表来实现程序随开机启动(高手就不用看了,嘿 ...

  9. Ubuntu 设置程序开机启动(以指定用户身份)

    一.方法 在/etc/rc.local写程序的启动命令(系统执行内核过程中会启动init进程,该进程把当前runlevel所对应的的所有service 都启动后,才会执行rc.local里的命令),程 ...

随机推荐

  1. UVA 10652 Board Wrapping(凸包)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32286 [思路] 凸包 根据角度与中心点求出长方形所有点来,然后就 ...

  2. 关于MySQL的分区(partion)

    1 CREATE TABLE part_tab ( c1 int default NULL, c2 ) default NULL, c3 date default NULL ) engine=myis ...

  3. linux ant 解决 错误: 找不到或无法加载主类 org.apache.tools.ant.launch.Launcher

    在使用ant进行java程序编译的时候出错.错误提示: Error: Could not find or load main class org.apache.tools.ant.launch.Lau ...

  4. 七个你必须重视的 Git 使用技巧

    与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命 ...

  5. Lattice Diamond安装

    1.下载:到Lattice官网 http://www.latticesemi.com/ 注册一个lattice的账号后就可以去下载Diamond,登陆后如下图,根据自己系统情况选择对应的版本,我用的是 ...

  6. IO(Input Output)流__字符流

    一.IO流简述------用于操作数据的 IO流用来处理设备之间的数据传输; Java对数据的操作是通过流的方式; Java用于操作流的对象都是在IO包中; 流按操作数据分为: 字节流(通用)和字符流 ...

  7. SSH-KeyGen 的用法 【转载】

    SSH-KeyGen 的用法 secureCrt通过密钥登录 做法:1.登录A机器 2.ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或 ...

  8. Cas Server中各配置文件介绍

    Cas Server中所有的配置文件都是放在WEB-INF目录及其子目录下的. 在WEB-INF/classes下的配置文件有: l  cas-theme-default.properties:该文件 ...

  9. oracle强化练习之分组函数

    1.      显示平均工资为>2000的职位 select job,avg(sal) from emp group by job having avg(sal)>2500; 2.     ...

  10. android之TabWidget选项卡

    1 概览 l  TabWidget与TabHost.tab组件一般包括TabHost和TabWidget.FrameLayout,且TabWidget.FrameLayout属于TabHost. l  ...