战士的艺术是保持平衡
在人类的恐惧和人类的奇迹之间。
“前往伊斯特拉的旅程”我的勇士之路-专业的残酷前端开发人员-在开发可在Sailfish上运行的应用程序与跨平台应用程序之间找到平衡。
最近,我一直在Digital Design担任开发人员一职,有时我不得不处理以前从未遇到过的任务。 这很有趣,而且经常很有趣。 例如,现在,我正在为Sailfish OS编写一个公司应用程序,并希望与您分享我的经验-下面将对此进行讨论。 如果您是新手开发人员,或者像我一样,面临着为Sailfish OS调整企业应用程序的任务,并且不知道从哪里开始以及尚未听说Qt和Sailfish功能的人员,请跟随我。
一些背景,或者我为什么这样做
当该公司5年前开发iPad版Areopad ISCO解决方案(iOS)时,没有人会想到客户需要一个应用程序才能在带有Sailfish OS的设备上工作(当时该操作系统也属于芬兰Jolla公司)。 但是在2016年,俄罗斯公司Open Mobile Platform获得了使用,修改,分发的许可证,并引起了人们的注意:它适应了家用移动设备和用户(主要是公司和政府机构),并
在注册表中注册了Sailfish Mobile OS RUS。 也许有人会说,现在这是俄罗斯唯一的官方移动设备操作系统。
自然,我们想了解它-我们已经征服了其余的OS,并且Sailfish显然拥有美好的未来(是的,我在谈论进口替代)。 由此可见,Sailfish的应用程序将成为现实! 第一个要测试的应用程序是用于大学机构Areopad工作的移动应用程序信息系统(它只是处于现代化阶段)。
现在关于qt
一个很棒的跨平台工具,包括开发环境,大量有用且方便的库,甚至您自己的QML标记语言。 我不会在很长一段时间内对此问题进行详细介绍,因为已经有许多文章介绍了有关哈布雷的这一奇迹,并且您还可以阅读
文档 ,该
文档很容易自然阅读。
为了以防万一,我将澄清计算和映射是在不同的模块(C ++和QML)中以不同的语言进行的,这些模块使用特殊的棘手方法(属性,信号槽)相互交互。
Qt是用于Sailfish开发软件的主要框架。
解决问题的方法:向左走-您将获得拐杖,向右走-您将失去功能
最初,受跨平台的想法和我将要实现的事实的启发,我认为为Sailfish编写的应用程序不会起飞,但会在其他任何操作系统(甚至是冰箱或水壶)上愉快地失败。 但是我的快乐一直持续到我坐下来在Android上运行它的那一刻-然后我感到难过。 Sailfish完全不适合此业务,并且绝对不打算更改任何内容。
如果Android或iOS允许您使用条件编译并为此提供某种工具包,则Sailfish无法与Linux区别开来(当然,在Qt内)。
接下来,出现QML兼容性问题:在Sailfish中,Qt Quick的过时版本(Sailfish为2.6,其他所有人已经为2.11),Android不知道Silica,Sailfish不知道QtQuick.Controls。 因此,对于不同的操作系统,您必须从不同的库中提取相同的组件,这会为每个操作系统生成几乎相同的文件。
同时,Silica可能具有与QtQuick.Controls相同的所有功能,但拒绝在任何其他平台上运行。
旗鱼功能
作为一个
懒惰的,尽可能创新的人,希望优化劳动力成本,我走了功能
阻力最小的道路,用纯Qt编写了我的杰作,而没有使用QtQuick.Controls和Silica。 因此,一切都可以在Sailfish上正常运行,但是在Android上,尽管我严格要求保持静止状态,但其中一半的元素已经移到某个地方处理可能重要的事情,因此下一步仍要在成年后离婚每个操作系统的不同角度的标记文件。 [稍后,当我准备发表文章时。 这个故事来自另一篇文章]。 请记住并接受:魔术常数是邪恶的(例如,宽度:15)。 在两个几乎完全相同的设备上,即使使用相同的操作系统,它们也可以相差2倍。
但是,我不得不指出,Sailfish版本中肯定有一些有趣的东西。 当然,在我熟悉他的如此短的时间内,几乎不可能了解Sailfish的整个丰富的内部世界-我们与他的关系处于``糖果花束时期''的阶段,其中很多我还没有研究过它的复杂特征。 此外,决定为所有操作系统绘制通用应用程序,因此我没有机会使用更复杂的机制来利用这一机会,但是我可能会告诉您一些有趣的观点。
我们将只讨论一个用于实现Silica GUI的库,因为我设法学习和理解的其余部分与标准QML编程没有什么不同。
这个工具让我最感兴趣,因为我没有在其他操作系统上看到过类似的东西,而且也很简单。 最重要的是,应用程序设计不是一个常数,而是取决于所选主题。
主题元素包含有关当前所选主题的信息:原色,字体大小,缩进和组件。 因此,在编写应用程序时,您无需对颜色进行硬编码,调整大小以适合屏幕,并且通常无需查看布局(原谅设计师,您已经做了很多工作),只需将所有内容从Theme元素中拉出来即可。 好吧,那不是很酷!

也是Sailfish的功能(尽管在Android中可能是可行的,但我还没有看到)。
菜单共有三种:
PullDownMenu-PushUpMenu-ContextMenu


至于Silica ... View-它们与标准的... View没有什么区别(它们具有±2个不太明显的属性),并且Button组件使您非常紧张-无法更改按钮的高度,您必须在各处编写Rectangle和MouseArea。 如果我仅使用此操作系统的标准设计为Sailfish进行应用程序,则无需更改按钮的高度,也可以使用
Silica的
组件 。 但是由于我正在为所有设备编写应用程序,因此决定使用最大的设计(Android),以便每个人都熟悉并感到舒适。 许多人不同意我的观点,并说您需要为每个平台使用本机UI元素,但这是一个完全不同的主题,多年来一直是主题,在这一时期,已经成长了一代以上的开发人员。
飞上Qt上的移动开发软膏
在Qt中,要与服务器通信,仅调用一个函数是不够的,您需要发送一个请求,并要求一个负责服务器响应的特殊对象在收到响应时调用响应处理函数(当然,我们自己编写):
void foo() { QNetworkRequest request("http://www.leningrad.spb.ru"); QNetworkReply *reply = mngr->get(request); connect(reply, &QNetworkReply::finished, this, &Class:: onReplyFinished); } void onReplyFinished () { QNetworkReply *reply = (QNetworkReply*)sender(); QByteArray ans = reply->readAll(); qDebug() << ans; }
当从服务器接收到响应时,将调用onReplyFinished函数,这可能要花费多长时间,取决于连接质量和服务器端。 现在想象一下,如何用1500-2000个请求来组织所有这些工作,在这种情况下,这些请求是相互依赖的,并且必须严格执行。 而且,如果您还记得整个UI部分取决于答案,那么它将变得非常可怕。
另一个主题是ListView,这是一个非常本地的Qt问题,但仍然令人不愉快。
任何自重的ListView必须具有标头组件,该组件作为第一个委托插入一些与其余元素根本不同的元素。 是的,他做到了,是的,他完美地绘制了所有内容,如果不是一个“而是”:我的代表占据了整个屏幕,需要滚动它,但是当我尝试从零索引向左滚动到标题时,他基本上拒绝了显示标题。 怎么办呢? 用拐杖塞的东西。 我在cpp部分中为此ListView编写的一部分模型构建代码,该代码尽可能准确地描述了正在发生的事情:
foreach (QVariant quest, QQuestions) { Questions.append(new Question(client, quest)); } kostilQuestions = Questions; if (Questions.size() > 0) kostilQuestions.prepend(Questions[0]);
接下来,在委托中创建2个独立项,其可见性取决于索引。
当索引为零时,我们看到一个,否则为另一个。
总结
结果,我得到了一个既可以在Android和iOS上运行的应用程序,又可以在Sailfish上运行的应用程序,更确切地说是一个适应这些操作系统的灵活应用程序。 魔术与它无关。 我找到了一种避免冲突的方法,并通过将一些文件替换为Sailfish以及其他所有人来与Sailfish成为所有OS的朋友。 这使我们能够在应用程序代码中为每个操作系统选择用户界面层。
我们可以假设我们迈出了第一步-我们与Sailfish交了朋友。 但是关于此的工作尚未完成,Sailfish和我将建立新的关系-我们正在准备Areopad CSIS应用程序以在注册表中进行注册(例如Sailfish应用程序),这意味着我们还需要对其进行调整以适应注册表。
我希望这很有趣。 待续。