海天之间的流水账

前些日子, 抠门的单位难得的组织了次年度旅游 (,,• ₃ •,,)
嗯, 没去多远的地方, 就去次北戴河, 算上路途一共三天.
很多年, 没去过海边了, 上次去还是上中学的时候, 心里还是有小些期待的.

- Read more -


如是春光

三月见底。
好像年后就没怎么想着写点什么了。哈哈哈哈哈哈哈哈。
嗯,不写的原因大多是日子过得没心没肺,想吐槽的转眼就忘记了。

也就如此吧。

过年的时候回了趟姥姥家,大家还好,就是外公身体不如过去好了,时间过的真快。
因为不在本地,回去的时间也少了,跟姥姥外公的关系大多没有妹妹们亲近,只记得外公一直很严厉。现在想起总觉得不是什么愉快的回忆。
人老了,总是有点不理智的地方,倒是可以理解的。只是说实在的,有点不能忍,很担心我老的那天也不会这样吧。

近来有点恐慌,关于现在,关于未来。

- Read more -


包子皮, 饺子馅儿

放羊了, 散伙了, 资本家给假了,
左拥着, 右抱着, 北京儿瘫着,
吃着的, 喝着的, 嘴里不停歇着,
包子皮, 饺子馅儿, 嘿新年快着乐~

- Read more -


千重山上听风来

上一次长长的雾霾结束之后, 终于在圣诞节后, 在各路神风的帮助下, 能够畅快的喘气到年底了. 虽然我知道, 很快新一波雾霾小友会一起来过元旦, 但是看到久别的蓝天, 心中仍是欢喜着: 好久不见!

本来早就想说要随便写写什么了, 但是一直懒神附体, 好吧, 再不写又成月刊了. 就, 随便说说吧.

- Read more -


又一年

上班的时候, 觉得时间过得缓慢, 慢的让人痛苦, 而周末的时候, 流逝的那么无声无息.
纵使我每月1-2封吐槽的频率, 恍恍惚惚, 在technetcal进入第三个年头了, 这不, 它又发邮件提醒我要交年费咯.
时间啊, 时光啊.


还记得中学那会, 曾经喜欢过一个小伙A, 很喜欢很喜欢.
那时候, 虽然人前人后玩得很疯, 但是我仍是一个腼腆害羞的妹纸, 就那么默默的喜欢着, 暗恋着.
记不得是什么时候开始喜欢的, 大概吸引我的就是他那股子不着调的活气, 嗯, 学习也很好.
不久之后, 朋友跟我说: 你看, 咱班的A在追妹纸B欸.
A是那种比较会张扬的性格吧, 所以很快大家都知道A和B在一起了.
B是一个漂亮的姑娘, 也很会打扮, 不像我是那种女汉纸的性格.
我到现在仍然记得那会儿B最爱的打扮, 达肩的披肩发, 一个带着小绒球的发卡, 轻轻把刘海挽起, 有那种和式娃娃的感觉.
好吧, 我也是一个喜欢欣赏漂亮姑娘的人啊, 看着自己确实B差距不小, 哈哈哈, 只认不如人, 于是跟自己说: 算了吧, 放了吧.
不记得过了多久, 没有那种伤心欲绝, 没有撕心裂肺, 但是我确实放下了.
有时候, 我现在去分析当时的自己, 也会惊异于自己竟会怎么快的走出来, 会觉得大概从一开始我就没有对其他人产生过爱这样的情感, 可以喜欢, 很喜欢, 但是不会觉得离不开谁.
接着讲回去吧, 后面某一天, 也不知道为何, A和B分手了, 蜕变成看客的我, 心底没有起任何涟漪.
可是有时候, 现实就那么好玩, 你猜猜, 过了那么大半年之后, 离开了B的A, 转而来追我了.
比B那次还要轰轰烈烈, 满班皆知.

- Read more -


我要跟你生猴子!!!

哈哈哈哈, 我一定要来得瑟下, 我有世界第一贴心的闺蜜殿下.
每天陪我一起聊天侃大山, 摸鱼摸到满手腥~
(=-=)还给我顺丰好吃的糕点, 灭哈哈哈哈, 简直就是太满足啦

喏喏, 凤梨酥
这家的凤梨酥太好吃了~ 舔舔手.

这叫什么酥
还有各种口味的酥.
直接顺丰大哥过来的, 太贴心了, 我要给你生猴子啊(QA Q )


夏日再见, 隆冬再会

所有的开心与不开心都会随着季节的变迁而慢慢消逝...
想来我并不是对这里失去兴趣了, 而是每次感触满满的时候都是在工作时间, 呃, 好吧

我所有的来这里溜达留言的朋友们, 谢谢大家还记得我~
嗯, 我需要一点时间去忙活别的去,
所以, 继续的请个假, 咱们隆冬再会~
20140727004729181.png


opencv&Qt环境配置过程记录

我就找地记录下配置过程.

  1. 先下载opencv 官网http://opencv.org/

  2. 编译opencv需要cmake, so下载cmake吧 官网https://cmake.org

  3. 在Qt选项中--编译与运行cmake项中配置好cmake

  4. 用Qt打开项目opencv/source/CmakeLists.txt, 于是你会发现它哗啦啦生成一大堆东西.
    然后一般的教程就不往下说了, 于是就被坑了!!!
    好吧, 经过各种谷各种歌之后, 果然let's go!

  5. 生成完了后 用qt运行, 这个时候会调用mingW32-make来编译opencv

  6. 嗯最好加一下mingW32-make的环境变量.

  7. 编译好了后 进入qt刚刚生成的build-xxxxx的目录, 在项目中可以配置该目录

  8. 用 mingW32-make install 很快的就会安装好 安装好后文件在当前目录下的install文件夹内.

  9. 我们需要用到的就是 opencv源码包里 build/include (里面有opencv和opencv2文件夹)
    mingW32-make install命令生成的 install文件夹
    添加install文件夹下的xx/bin到系统path下。

  10. [开始使用opencv]

  11. 用qt创建一个新的控制台应用

  12. 修改pro文件的内容, 加入

    INCLUDEPATH += \
        D:/OpenCV/include \
        D:/OpenCV/include/opencv/ \
        D:/OpenCV/include/opencv2/
    
    LIBS += \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_calib3d310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_core310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_features2d310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_flann310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_highgui310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_imgcodecs310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_imgproc310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_ml310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_objdetect310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_photo310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_shape310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_stitching310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_superres310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_ts310.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_video310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_videoio310.dll.a \
        D:/OpenCV/mingw/x86/mingw/lib/libopencv_videostab310.dll.a
    
    //当然D盘什么的地址是我当前的盘符地址, 记得改一下嗷, 还有libs中 x.dll.a文件由于opencv版本不一样, 可能有差别
    
  13. 在main.cpp中添加一个测试代码吧

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace cv;
    
    int main()
    {
        //声明IplImage指针
        IplImage*pImg;
        //载入图片
        pImg=cvLoadImage("e:/a.jpg",1);
        //创建窗口
        cvNamedWindow("my",1);
        //显示图像
        cvShowImage("my",pImg);
        //等待按键
        cvWaitKey(0);
        //销毁窗口
        cvDestroyWindow("my");
        //释放图像
        cvReleaseImage(&pImg);
        return 0;
    }
    

能运行就说明安装ok啦, 嗯, 我去玩opencv去了~


这年头,不能没网啊

在我苦盼的周末来临之际,各种原因之下,家里的路由器的电源,挂了。
于是,变成只有一条网线能上网且没有路由的苦逼局面。

尼玛,真是不知道,原来这年头,真的不能脱离网络存活了。
想写代码,发现有点超纲的知识要web上找资料;看看电影吧,都是online版;哦还有若干软件在网上等着我搬到碗里来。
这一断网,简直欲哭无泪。
啊啊啊啊啊~啊啊啊啊啊~
我的周末黄金的coding time啊~

给维修人员打电话,好吧,要一天后才来,还说这个电源很好买,让我们自己去买多快。
这一屋子懒得出门的人啊。
于是,无奈之下,把linux的笔记本做了wifi热点,win的台式躺了不能连网,好吧手头只剩下小mac能用了,哎,维修人员你啥时候来啊。
哭……

嗯,今儿母亲节,当麻麻的节日快乐。


实现一个竖向滚轮吧

嗯,其实在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传送门]