• 版块
    • 热门
    • 最新
    • 标签
    • 关于
    • 捐赠
    • 注册
    • 登录

    【Lesson4】跟我写一个“一言”

    已定时 已固定 已锁定 已移动 教程
    1 帖子 1 发布者 1.1k 浏览
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • BirdZhangB 在线
      BirdZhang 船长
      最后由 BirdZhang 编辑

      源码地址:https://github.com/0312birdzhang/harbour-hitokoto

      API地址: http://hitokoto.cn/api

      一言

      通过摇晃手机或吹一吹话筒来改变一言,也就是随机切换一言

      为了方便,我们这里只讲晃一晃

      Let's begin

      1.新建项目

      要上架旗鱼商店,必须是harbor-xxx 名称的。所以在创建项目的时候就写好,一劳永逸。如这里我叫harbour-hitokoto

      2.添加传感器

      打开rpm/harbour-hitokoto.spec文件,在BuildRequires上面添加下面

      Requires:   qt5-qtdeclarative-import-sensors
      Requires:   qt5-qtsensors-plugin-gestures-shake
      Requires:   qt5-qtsensors-plugin-gestures-sensor
      

      添加完之后的部分配置是这样的

      Source0:    %{name}-%{version}.tar.bz2
      Source100:  harbour-hitokoto.yaml
      Requires:   sailfishsilica-qt5 >= 0.10.9
      Requires:   qt5-qtdeclarative-import-sensors
      Requires:   qt5-qtsensors-plugin-gestures-shake
      Requires:   qt5-qtsensors-plugin-gestures-sensor
      BuildRequires:  pkgconfig(sailfishapp) >= 1.0.2
      BuildRequires:  pkgconfig(Qt5Core)
      BuildRequires:  pkgconfig(Qt5Qml)
      BuildRequires:  pkgconfig(Qt5Quick)
      BuildRequires:  desktop-file-utils
      
      %description
      

      3.调用摇动传感器

      在qml/harbor-hitokoto.qml中导入import QtSensors 5.0,然后就可以用SensorGesture了

      SensorGesture {
              id:gestureid
              gestures : ["QtSensors.shake"]
              enabled: true
              onDetected:{
                  //检测到晃动,干一些事
              }
          }
      

      我们新建一个main.js,来进行网络请求等。
      main.js内容如下:

      .pragma library
      
      var api = "https://sslapi.hitokoto.cn/?encode=json";
      var signalcenter;
      function sendWebRequest(url, callback, method, postdata) {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.onreadystatechange = function() {
                      switch(xmlhttp.readyState) {
                      case xmlhttp.OPENED:signalcenter.loadStarted();break;
                      case xmlhttp.HEADERS_RECEIVED:if (xmlhttp.status != 200)signalcenter.loadFailed(qsTr("error connection:")+xmlhttp.status+"  "+xmlhttp.statusText);break;
                      case xmlhttp.DONE:if (xmlhttp.status == 200) {
                              try {
                                  callback(xmlhttp.responseText);
                                  signalcenter.loadFinished();
                              } catch(e) {
                                  console.log(e)
                                  signalcenter.loadFailed(qsTr("loading erro..."));
                              }
                          } else {
                              signalcenter.loadFailed("");
                          }
                          break;
                      }
                  }
          if(method==="GET") {
              xmlhttp.open("GET",url);
              xmlhttp.send();
          }
          if(method==="POST") {
              xmlhttp.open("POST",url);
              xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
              xmlhttp.setRequestHeader("Content-Length", postdata.length);
              xmlhttp.send(postdata);
          }
      }
      
      function gethitokoto(){
          sendWebRequest(api, loadResult, "GET","");
      }
      
      var app;
      function loadResult(oritxt){
          var obj = JSON.parse(oritxt);
          //console.log(oritxt)
          app.hitokoto = obj.hitokoto;
          app.author = obj.creator;
          app.source = obj.from;
          app.catname = obj.type;
      }
      
      
      

      创建一个SignalCenter.qml,内容如下:

      import QtQuick 2.0
      import Sailfish.Silica 1.0
      
      QtObject{
               id:signalcenter;
               signal loadStarted;
               signal loadFinished;
               signal loadFailed(string errorstring);
      }
      

      4.要开始装逼了(笑

      在qml/harbor-hitokoto.qml中导入main.js

      import main.js as Main

      然后...

      emmmmmmmm....

      我还是直接贴代码吧

      import QtQuick 2.0
      import Sailfish.Silica 1.0
      import QtSensors 5.0
      import "./main.js" as JS
      
      ApplicationWindow{
          id: window
          property string hitokoto;
          property string  source
          property string  author
          property string  catname
          property bool loading: false
          cover: Qt.resolvedUrl("cover/CoverPage.qml")
          allowedOrientations: Orientation.Portrait
          _defaultPageOrientations: Orientation.Portrait
      
          BusyIndicator {
              id: busyIndicator
              anchors.centerIn: parent
              running: loading
              size: BusyIndicatorSize.Large
          }
      
      
      
          Connections{
              target: signalcenter;
              onLoadStarted:{
                  window.loading=true;
              }
              onLoadFinished:{
                  window.loading=false;
              }
              onLoadFailed:{
                  window.loading=false;
                  detectedText.text = errorstring;
              }
          }
      
          Signalcenter{
              id:signalcenter
          }
      
          SensorGesture {
              id:gestureid
              gestures : ["QtSensors.shake"]
              enabled: true
              onDetected:{
                  JS.gethitokoto()
              }
          }
      
      
      
          SilicaFlickable{
              anchors.fill: parent
              contentHeight: detectedText.height + contentExt.height + Theme.paddingMedium
              Label{
                  id:detectedText
                  anchors{
                      left:parent.left
                      right:parent.right
                      margins: Theme.paddingMedium
                  }
                  y:window.height / 2 - detectedText.height /2
                  width: parent.width
                  wrapMode: Text.WordWrap
                  font.pixelSize: Theme.fontSizeLarge
                  color: Theme.highlightColor
                  opacity:0.7
                  font.bold: true
                  horizontalAlignment: Text.AlignLeft
                  truncationMode: TruncationMode.Elide
                  text: getRandomIcon()+ ": "+hitokoto
                  MouseArea{
                      anchors.fill: parent
                      onPressAndHold: {
                          Clipboard.text = hitokoto;
                      }
                  }
              }
              Label{
                  id:contentExt
                  text:"——"+(source?(source+","):"")
                  width:parent.width * 0.7
                  wrapMode: Text.WordWrap
                  font.pixelSize:Theme.fontSizeSmall
                  horizontalAlignment: Text.AlignRight
                  anchors{
                      top:detectedText.bottom
                      right:parent.right
                      margins: Theme.paddingMedium
                  }
              }
      
          }
          Component.onCompleted: {
              JS.signalcenter = signalcenter
              JS.app = window
              JS.gethitokoto();
          }
      }
      

      ———扬帆起航🚢

      1 条回复 最后回复 回复 引用 0
      • 1 / 1
      • 第一个帖子
        最后一个帖子
      Copyright © 2017-2024 旗鱼俱乐部 旗鱼系统交流论坛
      🐟🐠🐡论坛客户端下载🐟🐠🐡
      友情链接 SailfishOS.org | Jolla | 官方论坛 | 移植wiki| 第三方商店 | BirdZhang的博客| Securest
      除非另有声明,本网站采用知识共享“署名 4.0 中国大陆”许可协议授权。
      根据相关法律法规,本站不对欧盟用户提供服务。
      Powered by NodeBB