实现一个竖向滚轮吧

嗯,其实在qt里有滚轮的控件,叫 ScrollBar ,在 Qt.labs.controls 1.0 包里,好吧,我就是闲的慌,想自己实现一个它的效果。=。=说起来汗颜的是,一开始看 Documentation 的时候,看到这个控件的几个属性,还各种的满不在乎,觉得尼玛这个设计好愚蠢。但当我实现了这个控件时,才发现,尼玛,我自己竟然也把这几个属性留出接口了,这真是,好尴尬啊……打脸啊……


分析下它的功能吧,仔细把玩了下竖向滚轮。

  • 滚轮的中间有一个滑块
  • 滑块占整体滚轮的比例跟文本区的可显示大小/整体文本大小有关
  • 滑块的显示高度跟当前可见文本区域在整个文本区域的位置有关
  • 滑块可以拖动的,拖动的时候会跟随鼠标的拖动方向移动
  • 滑块拖动的时候,它控制的文本也会同方向移动
  • 点击滑块上面的空白,页面会随着向上滚动,直至滑块到达鼠标位置
  • 点击滑块下面的空白,页面会随着向下滚动,直至滑块到达鼠标位置

其实,从描述上可以看到,如果就是简单的拿 Rectangle 堆出一个滚轮的话,它是一个三层结构。

三层结构大概的示意图

一开始我的第一反应是在中间的滑块上单独再有一个 MouseArea ,不过后来仔细琢磨了下发现其实那样设计会造成移动滑块的时候的处理变得更加复杂,其实那样设计除了看着舒心,并没有带来什么好处。所以,权衡之后,还是打算只用一个大 MouseArea 盖在上面,通过对鼠标坐标移动的信号来对不同的事件进行处理。

其实想通的话,整个滚轮实现起来并不难。不过有两个坑的地方,一个是按空白的地方,页面自动跑那里,我是靠了一个定时器来实现的页面滚动,通过定时页面高度自增自减。还一个地方其实就是滚轮移动比例到页面移动比例的换算千万别弄忘了,(。・`ω´・) 我一开始就忘记了,结果整个页面起飞了。


嗯,剩下这个控件很简单了,我依然将控件的逻辑部分和样式进行了分离,分别在 control 和 style 里,同时 control 里为了能够控制页面滚动,所以留了一个 Item 类型的属性,如果没对这个属性进行设置,会发现滚轮没有效果,但是不会报错的!

最终的大概效果。
控件的样子

代码如下:

control文件

//VerticalScrollBar.qml
import QtQuick 2.5
import QtQuick.Controls 1.3
import QtQuick.Controls.Private 1.0

Control {
    id: root
    implicitWidth: 10
    implicitHeight: parent.height

    style: Qt.createComponent("VerticalScrollBarStyle.qml", root)

    property Item handleItem // verticalscrollbar 控制的Flickable类控件,必须要设置哦,不设置滚轮是没有反应的
    property alias size: scrollbtn.height //滚轮的长度 height
    property alias position: scrollbtn.y //滚轮的高度 y

    property int __scrollState: 0 //-1向上滚 0不滚 1向下滚
    property int __scrollStep: 20 //按下空白时候的移动步长
    property double __offset: 0
    property bool __dragScroll: false //是否按下滚轮

    clip: true

    Timer {
        interval: 20
        running: !!handleItem
             &&__scrollState!==0
             && handleItem.contentY>=0
             && handleItem.contentY<=handleItem.contentHeight-handleItem.height
        repeat: true
        onTriggered: {
            if (!!handleItem) {
                handleItem.contentY += __scrollStep*__scrollState
            }
        }
    }

    Loader {
        id: backboard
        property Component __bkract //背景图案
        anchors.fill: parent
        sourceComponent: __style && __style.background ? __style.background : __bkract
    }

    Loader {
        id: scrollbtn
        property Component __scrollbtn //滑轮图案
        width: parent.width
        sourceComponent: __style && __style.scroll ? __style.scroll : __scrollbtn

        onYChanged: {
            if (y<mousearea.mouseY && y>mousearea.mouseY-height) {
                __scrollState = 0
            }
        }
    }

    MouseArea {
        id: mousearea
        anchors.fill: backboard

        property double oldY: -1
        onPressed: {
            if(mouseY<=scrollbtn.y) {//按住滚轮空白区域滚轮往上
                __scrollState = -1

            }else if(mouseY>=scrollbtn.y+scrollbtn.height) {//按住滚轮空白区域滚轮往下
                __scrollState = 1

            }else {
                __scrollState = 0
                __dragScroll = true
                oldY = mouseY

                __offset = !!handleItem? handleItem.contentY-oldY*handleItem.contentHeight/handleItem.height : 0
            }
        }
        onReleased: {
            __scrollState = 0
            __dragScroll = false
            oldY = -1
        }
        onPositionChanged: {
            if(!!handleItem && pressed && oldY!==-1) {
                var offsetMouseY = mouseY*handleItem.contentHeight/handleItem.height
                handleItem.contentY = __offset+offsetMouseY>=0? (__offset+offsetMouseY<=handleItem.contentHeight-handleItem.height? __offset+offsetMouseY : handleItem.contentHeight-handleItem.height) : 0
            }
        }
    }
}

style文件

//VerticalScrollBarStyle.qml
import QtQuick 2.5
import QtQuick.Controls 1.3
import QtQuick.Controls.Private 1.0

Style {
    id:style

    //背景样式
    property Component background: Rectangle {
        color: "#fcfcfc"
        Rectangle {
            width: 1
            height: control.height
            color: "#cccccc"
        }
    }

    //滚动条滚轮
    property Component scroll: Item {
        Rectangle {
            width: parent.width-4
            height: parent.height-4
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.horizontalCenterOffset: 0.5
            anchors.verticalCenter: parent.verticalCenter
            color: control.__dragScroll? "#777777" : "#bbbbbb"
            radius: width
        }
    }
}

嗯,就是酱紫简单就哦了,具体使用例子,请烦劳移驾github吧~[(๑→ܫ←)github传送门]


但求你也问心无愧

于是,再一次验证了,人果然都是惰性的。
习惯停下了,就这么习惯了。
大约是一个冬季,一字未落笔,好吧。
其实写的过程就是思考的过程,但是果然,我更喜欢思考,想明白了就懒于动笔。
这约莫是上学期间就积累下来的坏习惯了。

这个冬季真的发生了很多事。有的,想想总是很寒心,不过总算是尘埃落地。
……

上一个东家,是一个很小、很小、很小的创业公司。
在这个创业一词莫名火了的年代,我也算是跟了把潮流去感受了下。
嗯,简单形容就是,环境很艰苦,加班很常态……
我是想来吐槽来着。
一直是这样觉得,对于创业公司来说,idea很重要、团队很重要,但是boss最重要,或者说boss的想法、理念、思考最重要。idea不好,嘴来凑、技术来补;团队不好,大浪淘沙、终归是有合适的能留下的;boss没能力,那就真的…………呃,炒boss?洗洗睡吧。
很不幸的,上个老板就是这样的人。

他呀,也许是年龄的关系吧,幼稚、固执、想一出是一出。其实idea构想还不错,也确实是当下比较会流行的玩意,但是当时市面上已有不少同类app了,并且有一家同类刚刚获得比较大的投资。在这种情况下,好吧,我们的app并没有自己的特色,每天boss在公众号上孜孜不倦的卖萌以拉来用户、增加黏度=。=
其实也没啥,要是那么容易还叫创业嘛。
但问题是,他真的是想一出是一出。
一天说,我们做个网站xxx吧;一天说,嗯淘宝店要装修,我们要卖东西;一天说,要再上线个app……
我真的是无语的不得了,也跟他提了很多想法,毫不意外的被无视掉了。
这都不是事啊,最奇葩的是,某天突然说,从今天开始我们996吧,因为别的公司都这样……
还有,2月不是天数少么,他算工资的时候,竟然是按天数的,还刨去了法定节假日,我就去了!

其实,如果在做有意思的事儿,干活我心情好,这些我真的都不在乎。
但是,老板最爱做的事就是给你一活,半小时就问你一次“做完没?”、“还没弄完?”、“你怎么弄的这么慢?”、“这很难么?”。
一次次给人幼小的心灵不要脸的打击,我真的开心不起来啊,“你来干好不好啊,老板”。
嗯,还有就是尼玛我入职的时候问有社保的吧,他说有。
然后,嗯?亲,说好的社保呢?

说到底,不合适就散了吧,大家都轻松,我就是这么想的,于是春光明媚的3月,我就跟他说拜拜了。
我必须承认,当时没忍住,跟他撕逼了一场后,收拾东西,滚犊子了。
走之前,跟管财务的汉纸说,给我结一下工资呗,他说好,但是现在忙,晚点给我,让我先走吧。
我就这么信了,然后走了。
然后,就这么没信了,信了,了……
过程不想细说了,总之就是我每次给财物汉纸打电话他拒接,发微信他不回,各种说我走老板很生气,不让给我发工资;什么公司没钱,发不出工资,要分期……
我也是脾气好、包子呗,每次他说啥,我其实都特别体谅他,完了各种说好之后,我说行,然后他又骗了我。反反复复……
我跟他说,你在这样,我要去找仲裁了。他说,去呗,公司没钱,不给你发也是一样是想拖着你。
……

这事挺打击我的,真的,我没想过会遇见这样的人、这样的公司。我是那种特别看重承诺的人,一诺千金,我不会轻易答应别人,但是一旦答应,累死累活也会去完成。在整个过程中,他们各种答应我,各种我们说好了哦,然后就像耳畔吹过的风。
我也反思过,为何会这么轻易的相信他们的话……约莫是因为,我就是这样的人吧。

终归是有个好结果,在我准备好资料,做好仲裁的准备,最后一次打电话给他,明确的说了,今天解决不了我明天就去仲裁,2月工资数不对您也别发了我直接仲裁去,等等之后,他在拖我2个月后,终于发了。虽然还有被扣的钱,我真的就当买教训了。

好吧,跟上个东家,就是这样,缘已尽了。
……

这是3月到前几天的事啦。
这些天,过的很开心了,跟着有趣的人做有趣的事,不累,很开心。
真要说的什么感触的话,就是深深的感到,果然什么都是相通的,这就是起源罢。
还是,下次再说吧,好久不见~

- Read more -


I'll be back after the Chinese new year

工作小忙&捣鼓一些没什么大不了的小把戏,so……


晚霞明似锦

IMG_0162-small.jpg

只是想分享下,今天下午偶然捕获到的美景~
果然站在高处,总是会有想要起飞的冲动
为何没有一双翅膀,带我装b带我飞呀~

嗯,已是周三,想来周五也不远了。
未来的周末,愉快啦。


在停下的地方重新上路

每次更新的时候,都是发现自己已经快有一月余没有更新过了。
嗯,这个毛病还是要改~

好吧,消失这么久,我果断的是去渣电视剧了。
看完了狼牙棒。
一直感觉我应该是属于那种蛮不容易入戏的人。
也在看第一集的时候,就意识到苏先生一定会领便当啊领便当。
但是看到最后苏先生跟琅琊阁主说要出征那儿,背景音乐一起,眼泪哗啦一下子,就泄开来……
好吧,这么多年来,不多的入戏了。
……
结果就是,我花了一周的时间,终于心情平复下来了,哎!
客观的给个评价吧,虽然还是有值得吐槽的地方,但是确实是,不多的良心剧了。

然后就是确实最近工作蛮忙的,上班都找不到摸鱼的时间好么!!!
23333
对了,说到上班,我一定要吐槽,尼玛,那天新来了个ios的开发小哥。
说起他来,我真是,头一次见到,代码洁癖那么严重的人。
自问,我也算是有代码洁癖了。譬如,要求缩进对齐、注释、变量函数等命名好看= =
但跟他一比,我简直是弱爆了!!!

本来的ios小妹水平不好,老大招了他来。
着急项目上线,让他帮着小妹一起解决完了上线。
他吭哧吭哧2天,老大问“怎么样了”
他他,他,他说“无法接手别人的代码、要自己把那项目代码重写”
……
当然,作为现在不做技术的我来说,跟我一毛钱关系都没有^_^
不过但我听到后,那个万马奔腾,我勒个去啊
就差给我个内心切个镜头,我的独白能绕地球两周半……
嗯,两周半!!!

想想还有啥可吐槽的没,
最近帝都好冷啊,
我已经开始穿秋裤+毛衣了。
暖气君快来(招手~)

最后附一个,今天下午跟基友的聊天记录,原谅我们年少轻狂爱装逼
23333,黑历史留底~ (左:基友,右:我)

屏幕快照 2015-10-26 21.57.56.png
屏幕快照 2015-10-26 21.58.12.png
屏幕快照 2015-10-26 21.58.25.png
屏幕快照 2015-10-26 21.58.39.png

- Read more -


念旧的我们

公司旁边的麦当劳今天开业,放着礼炮、做着活动。
突然发现麦当劳25周年了。
想起小时候的奶昔大哥还有汉堡神偷,门口的麦当劳叔叔,
他们都去哪儿了……

在网上看到这样一段话

后来汉堡神偷、大鸟姐姐和奶昔大哥
都不知道去哪儿了
只剩下麦当劳叔叔一个人坐在门口
画着小丑的妆容 强颜欢笑
再后来门口的麦当劳叔叔
竟然也不见了
……
一晃眼十几年
我最喜欢喝的奶昔没有了
我也再找不见汉堡神偷他们了

麦当劳25周年

时间不经意间就慢慢流淌。
翻一页就是新时代。
从80后、90后、95后、到00后。
于是,蓦然回首,我发现我已然不再年少了……


嘿,这个家伙是不是弃坑了~

嗯哼,我知道一定会有人这么想。
其实、本来、今天也有点懒得写字。
不过想想来,已经好久没有动笔了,好吧。
=。=乃们要相信,我真的没有弃坑,这么可爱的域名,我怎么会轻易弃坑呢。

最近,在努力学习ui技术。嗯,每天起早贪黑辛苦啊QAQ
入门阶段快要结束了,哎,学无止境。
不过还有不少没有掌握好。
从一个熟悉的领域跳到另一个,其实还是有不少差距的。
我会加油的。
作品的话,其实我早在index上留了study的口子,但是一直没有给链接。
原因的话,我的作品都泡在本子里发芽懒得上传呢。
约莫不会直接传到这边了,图片都太大,会拖累页面加载速度的。
还是去费大公司的流量吧,咩哈哈哈哈哈哈哈~
嗯,打算可能明年转阿里云去吧,这样可以自己开发些功能了,到时候再重新整理下博客啥的。其实我真的不想备案,看着好麻烦啊~

最近帝都上空的雨娘娘老在看韩剧,雨水哗啦啦啦的往下掉。
目睹好几次浪花朵朵啦~
其实我真的不太喜欢下雨。


一起回到童年 六一快乐!

百度banner

今儿个打开百度,突然被他的banner萌的睁不开眼。
一个男青年坐在秋千上,随着荡起来的秋千慢慢变小、回到童年,然后title上写着“一起回到童年 六一快乐”。
欸,这个貌似跟蒙牛纯甄,喝酸奶然后变年轻那个广告异曲同工啊~

突然想起昨天晚上看的电视,记者采访一个小朋友。
问:你长大以后打算干什么?
答:我想当国-家-主-席。
问:为什么呀?
答:我想为人民服务。
=。=果然小朋友的想法都是蛮奇特的啊。

嘿,六一儿童节啦,『节日快乐』!


守坝员 The Dam Keeper

The Dam Keeper

通过我的一个窗口,所有我能看到的,是云和灰尘的海洋,它令一切窒息。 从另个窗口,我看到镇上的人们。从这两个窗口,我看到的都是黑暗。 爸爸总是说,守坝员,这个工作,是为了远离黑暗。 那时候,我一直是一个人工作,我是守坝员。

最近看了一部短篇,『The Dam Keeper』。
画风很可爱,类似蜡笔的感觉,一直软绵绵的、软绵绵的。
18分钟,看完后,心情很复杂、还有一点心酸和感动。有点说不上来的感觉,哎,如何才能守住内心的大坝,让阳光照进来……
好吧,结局最后是happy ending还是让人很开心的。

哦,对了官网做的很萌,推荐去瞅瞅~[点我 GO]


来,unity5手动激活

结局:今天折腾了一天,终于把unity成功安装激活好了。

起因:最近打算自学下unity,然后今天兴冲冲的跑去u3d官网看了老久,并打算装个玩玩~
然后我下了最新的unity5,一路顺利,当时愚蠢,没下离线安装包,然后在线装了好久好久……
不过还好,装的还是很快的,于是装完后,我兴冲冲的点开unity。
然后,弹出了激活页面。
穷人嘛,就打算装个免费的personal版本就好。
填好了用户名、密码、喜好目的等等,终于到最后看到“start using unity”。
大大的页面上一行“You'er done!”看的人真是热血沸腾,然后我就点了开始的按钮,然后,然后……程序的就真的“done”了……
||( TAT)||……摔!

于是,我开始用伟大的度娘试图解决这个问题。

有人说是,激活服务器时钟慢多等几小时就好;有人说要多试几次就能激活;有人说遇见这种情况就重新注册就行了;也有人说是激活服务器被墙了,上个vpn激活……
我大体都试了一遍,简直是泪流满面……
就在我打算实在不行上D版吧的时候,发现嘿嘿,其实还可以手动激活~
真是柳暗花明。


手动激活教程如下,本来想自己写的,当时太激动,完全忘记截图了。

源地址:百度贴吧

  1. 激活第一步,断网,双击unity3d的桌面图标这时会出现这样的页面,点击红框内的按钮。

    1

  2. 然后会出现如下页面,点击红框内的按钮,随便找个文件夹保存就行。

    2

  3. 点击如步骤2给的链接https://license.unity3d.com/manual会出现如下窗口,点击红框内的按钮上传你刚才保存的文件。点击“ok”按钮。

    3

  4. 步骤3完成后会出现如下页面,选择第二个内容,点击“ok”按钮

    4

  5. 之后输入你在官网上注册的用户名和密码就出现如下页面,点击蓝色按钮,下载证书。

    5

  6. 这时需要重新断网,再次打开unity3d,点击红框内的按钮,上传你第5步下载的证书即可,马上你就能看到心仪的unity3d了。

    6