为taskBus业余软件无线电平台完善自启动和自动运行功能
这个taskBus 是一款我和朋友们一起开发的业余软件无线电平台,使用增强管道数据流转EPDR技术实现基于标准输入输出管道的交互。它的项目文件为json格式,扩展名为tbj。
因为很懒,一直以来,运行一个tbj文件,都需要打开、运行这些步骤。若要自动运行,需要依靠命令行模式的 taskbusConsole来执行。其实,想要GUI程序通过命令行打开文件,也是最基础的操作。但是这个功能竟然一直都没有实现。今天,就来实现一下。
题外话
相关代码发行版参考gitcode.net或者gitcode.com,如果它们还在的话。
我会保持git的链接可用。在非一线城市,github实在打不开,因此,我的所有代码都托管在国内的git。github上找到的,应该都是老的版本,有网络好爱好者的搬上去的。在发行版说明里有到网盘的链接,里面有编译好的windows版本。
1. 命令行参数设计
既然要添加命令行支持,当然需要一步到位完善一些。我们希望支持如下命令行参数:
调用方式:
C:\>可执行文件.exe [参数] [文件1.tbj [文件2.tbj ]...]
注意,中括号[]不是命令的一部分,而是说明里面的参数是可选的。尖括号<>是表示里面的参数是必选的。
参数:
--run 或者 -r : 执行打开的文件
--title <标题> 或者 -t <标题> :设置窗口的标题为title
--hide :启动后隐藏窗口到任务栏图标
--help或者-h或者-? :显示帮助命令。
2. 命令行解析
如果是C语言则有专门的命令行解析工具getopt。此外,在Qt下,Qt的app也已经把命令行参数分离好了。我们直接用Qt分离好的参数,直接修改 main 函数,添加解析部分:
#include <QApplication>
//...
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//open Cmdline
QStringList cmdlineList = app.arguments();
int cntv = 0;
bool autorun = false;
bool autohide = false;
bool pophelp = false;
bool next_is_title = false;
QString title = "";
QStringList openFiles;
foreach (QString argsre, cmdlineList)
{
if (!cntv++)
continue;
if (argsre=="--run"||argsre=="-r")
autorun = true;
else if (argsre=="--hide")
autohide = true;
else if (argsre=="--title"||argsre=="-t")
next_is_title = true;
else if (argsre=="--help"||argsre=="-h"||argsre=="-?")
pophelp = true;
else if (next_is_title)
{
title = argsre;
next_is_title = false;
}
else
{
QFileInfo info_f(argsre);
if (info_f.exists() && info_f.isFile())
{
openFiles << info_f.absoluteFilePath();
}
else
pophelp = true;
}
}
if (pophelp)
{
QString argv1 = argv[0];
QMessageBox::information(&w,"Help",
"Usage: \n" +
argv1 +
"\n\t --run|-r : Run Opened projects(*.tbj);"
"\n\t --title|-t <title> :Set program title;"
"\n\t --hide :Hide mainframe;"
"\n\t --help|-h|-? :Show this help message;"
);
}
foreach (QString fm, openFiles)
{
w.openProject(fm,autorun);
}
if (title.length()>1 && title.length()<256)
w.setWindowTitle(title);
if (autohide)
w.hideMainFrame();
int ret = app.exec();
LOG_PROFILE("Program",QString("Main End with return value %1.").arg(ret));
return ret;
}
当然,这个处理方式和getopt相比,无法处理=分隔符,以及-t123这种没有空格分离的情况。
3. 使用显式事件循环
在主窗口执行打开动作的时候,因为原始设计中有些依赖定时器等工作的逻辑,需要显式进行消息循环,保证打开多个文件的时候,不会错乱。
void taskBusPlatformFrm::openProject(QString filename, bool autorun)
{
slot_openprj(filename);
for (int i=0;i<100;++i)
{
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
QThread::msleep(10);
}
if (autorun)
on_action_Start_project_triggered();
for (int i=0;i<100;++i)
{
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
QThread::msleep(10);
}
}
4. 综合效果
综合效果:
- 可使用双击 tbj 文件的方式,选择“打开方式”为taskBusPlatform.exe打开文件。
- 可以使用命令行 “taskBusPlatform.exe -r 文件名 ”的方式运行文件。
- 可以指定 --hide 参数隐藏主界面
- 可以指定"–title 标题名"的方式改变主窗口的标题。这样,可以在运行多个主窗口的情况下,在任务栏区分各个窗口的功能。
如果选择“始终以这个程序打开tbj文件”,会发现图标也改变了。
如果创建 sendTo快捷方式,只要在cmd里敲
shell:sendto
而后新建快捷方式:
把 -r 添加进快捷方式。注意,如果无法自动运行,-r 或者–run的后面,要跟着一个空格,则可以直接打开并运行工程。
如果加入 --hide,则发现运行后,主界面不见了,回到了任务栏图标。
如果加入 --title,则发现标题也变了。
taskBusPlatform.exe --title 测试 --hide --run C:\projects\projects.tbj
如此一来,taskBus就可以作为无人值守桌面一部分,放到“启动”里去了,直接打开程序,使得没有键鼠的树莓派看起来就像一个自动设备,加电即可运行。比如,参考这个文章的方法,设置一个MP3电台,给敬老院爷爷们的Old Radio放放老歌。
原文地址:https://blog.csdn.net/goldenhawking/article/details/140539198
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!