Qt程序开机启动的怪现象————无法正常显示程序皮肤

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

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

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

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

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

 1 //获取当前exe文件所在路径
 2 std::string get_app_run_path()
 3 {
 4     char szFilePath[MAX_PATH + 1];
 5     GetModuleFileNameA(NULL, szFilePath, MAX_PATH);
 6     (strrchr(szFilePath, (‘\\‘)))[1] = 0;//删除文件名,只获得路径
 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
52     mainWindow w;
53     w.show();
54
55 。。。
56     int rt = a.exec();
57     return rt;
58 }

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

时间: 2024-10-28 11:51:16

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

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

注意:CentOS 6下基本没什么问题,CentOS 7估计不一定能行. 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. 1.把启动程序的命令添加到/etc/rc.d/rc.local文件中,比如下面的是设置开机启动httpd. #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in

C# Winform 注册程序开机启动

1 开机启动 public static bool SetAutoRun(string keyName, string filePath) { try { RegistryKey Local= Registry.LocalMachine; RegistryKey runKey =Local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"); runKey.SetValue(keyName, filePath)

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

今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直接说实用的,怎么用这个东西. 关于这个问题,相信很多学Android的都会去关注这个问题,大家普遍会有个这样的疑问:安卓是怎么跑起来的? 最简单的说法,安卓系统是这样加载的: Bootloader------Kernel(对应平台版本的Linux内核)------filesystem文件系统(这个就

脚你一秒钟让你的程序开机启动

点击开始菜单,找到启动文件夹,打开,并把你想要开机启动的程序的快捷方式粘贴过去即可.亲测txt,qq,等都能设置开机启动

node-webkit设置程序开机启动

上一篇写了打包脚本中设置安装时开机启动,这一篇写由node.js来控制程序是否随windows系统开机启动. 首页在项目package.json中加入对windows-shortcuts的引用(手动下载地址https://github.com/j201/windows-shortcuts) "dependencies": { "windows-shortcuts":"*" } 在npm install windows-shortcuts,加入快捷

C#实现程序开机启动

如何用c#实现开机启动?其实用c#实现程序的开机启动大致有两种方法,就是写入注册表或者采用服务程序,最近一直研究着用C#来操作注册表,下面介绍的方法便是用注册表来实现程序随开机启动(高手就不用看了,嘿嘿...).1)引入命名空间 using Microsoft.Win32; //打开注册表子项RegistryKey key = Registry.LocalMachine.OpenSubKe("SOFTWARE//Microsoft//Windows//CurrentVersion//Run&qu

电脑程序开机启动设置

来源:http://jingyan.baidu.com/article/19020a0ada910f529d2842b1.html 对于设置开机启动的设置,开始->所有程序->启动,将需要开机启动的应用程序放在启动下面: 对于设置开机启动与不启动,可以通过:开始->运行,在运行界面中输入msconfig,按确定键,之后出现如下界面,将启动条目下中相应的 应用程序前面的复选框中添加或去除勾,即可实现相应应用程序在开机是自启动或不启动.

winform 程序开机启动

private void Form1_Load(object sender, EventArgs e) { try { //程序运行位置 string R_startPath = Application.ExecutablePath; //对应于HKEY_LOCAL_MACHINE主键 RegistryKey R_local = Registry.LocalMachine; //开机自动运行 RegistryKey R_run = R_local.CreateSubKey("SOFTWARE\\

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

这段时间一直进行cs项目,故整理下开机自动运行.托盘.显示.隐藏. (1).在窗口上点击关闭按钮或者最小化时将托盘显示: (2).双击托盘图标显示窗口: (3).右键点击托盘图标提供三个菜单选项,“退出”.“隐藏”.“显示”: (4).程序可以设置开机启动,隐藏任务栏显示.就这四个小功能. 1.建一个WinForm程序—FormAuto,将其属性ShowInTaskbar改为false,这样程序将不会在任务栏中显示:将MaximizeBox属性设置为false,屏蔽掉最大化按钮:把StartPo