0%

​ 在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口。本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口的缩放相关的程序放在一起,下面专门单独分离出来。

​ 窗口的拖放只涉及到鼠标事件:按下操作、释放操作和移动操作,因此只需要重写这三个函数。由于程序比较简单,并且注释也比较详细,就不作过多介绍。新建一个基类为QWidget的Qt Gui应用程序,只需修改widget.h和widget.cpp文件如下

1、widget.h文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>//注意我使用的是Qt5,Qt4与Qt5的区别可以参考http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5
#include<QMouseEvent>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

QPoint move_point; //移动的距离
bool mouse_press; //鼠标按下
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);

private:
Ui::Widget *ui;
};

#endif // WIDGET_H

2、widget.cpp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setMouseTracking(false);
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//设置主窗口无边框
}

Widget::~Widget()
{
delete ui;
}

void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
this->setMouseTracking(true);
mouse_press = true;
//鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos())
move_point = event->pos();;
}

}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
//设置鼠标为未被按下
mouse_press = false;
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
//若鼠标左键被按下
// qDebug()<<"mouse_press="<<event->globalPos();
if(mouse_press)
{
//鼠标相对于屏幕的位置
QPoint move_pos = event->globalPos();

//移动主窗体位置
this->move(move_pos - move_point);
}
}

基于Qt的词典开发系列

  1. 词典框架设计及成品展示
  2. 本地词典的设计
  3. 开始菜单的设计
  4. 无边框窗口的缩放与拖动
  5. 无边框窗口的拖动
  6. 界面美化设计
  7. 调用网络API
  8. 用户登录及API调用的实现
  9. JSON数据解析
  10. 国际音标的显示
  11. 系统托盘的显示
  12. 调用讲述人
  13. 音频播放
  14. 自动补全功能
  15. HTML特殊字符及正则表达式
  16. 后序

作品下载地址(发布版)http://download.csdn.net/detail/tengweitw/8548767

作品下载地址(绿色版)http://download.csdn.net/detail/tengweitw/8830495

源码下载地址http://download.csdn.net/detail/tengweitw/8830503

​ 在现在,绝大多数软件都向着简洁,时尚发展。就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了)。

有道的单词本:

图1

我所做的单词本:

图2

阅读全文 »

最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项)。这个自动补全功能十分常见,百度搜索关键词时就会出现。不过它们这些补全功能都是与你输入的进行首字匹配,有时也会不方便。例如,如果我输入一个“好”,如果是首字匹配的话会出现下图:

图1

如果是句中匹配的话,则是这种情况:

图2

你可以根据自己的要求进行选择哪一种模式。

阅读全文 »

在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类。然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直接调用Qt自带的类进行网络音频播放和本地播放。比较适用于单词的网上发音和无网情况下的本地发音,而不用将音频文件下载下来,占用太多内存。

阅读全文 »

​ 我们知道,win7系统自带有讲述人,即可以机器读出当前内容,具体可以将电脑锁定,然后点击左下角的按钮即可。之前在用Matlab写扫雷游戏的时候,也曾经调用过讲述人来进行游戏的语音提示。具体的Matlab脚本文件如下:

1
2
sp=actxserver('SAPI.SpVoice');
sp.Speak('你好,欢迎来到西安电子科技大学!Hello,Welcome to XD University!')
阅读全文 »

本文是对前面LaTeX论文排版文章的总结。前面的几篇文章是分别从论文的几个方面来讲述LaTeX的排版问题,这里综合了前面的内容,给出了论文排版的模版。

阅读全文 »

在学校经常有同学电脑失窃,大抵都是粗细大意。据说iPhone手机失窃后可以获取小偷的照片,从而将照片找到。现在用matlab写一个程序使得当小偷使用电脑上网时,电脑自动将电脑前面的人的照片发到你指定的邮箱。前提是你的电脑装有摄像头并且有网!先用下面代码测试你邮箱是否正确设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
clear
myaddress='sender@qq.com';
%这里sender为你发邮箱的qq号,注意你的邮箱要已经提供SMTP服务,没有也没关系,qq邮箱会提醒设置设置的mypassword='password';%这里为你邮上面邮箱对应的密码(一般和QQ密码相同)
to = 'receiver@qq.com'; %这里为你要发送到的邮箱
setpref('Internet','E_mail',myaddress);
setpref('Internet','SMTP_Server','smtp.qq.com');
setpref('Internet','SMTP_Username',myaddress);
setpref('Internet','SMTP_Password',mypassword);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
subject ='电脑小偷';

obj = videoinput('winvideo');
h=preview(obj);
set(gcf,'Visible','off')
set(h,'Visible','on')
start(obj);
pause(10);
photo=getsnapshot(obj);
imwrite(photo, 'thief.jpg')
sendmail(to, subject,[],'thief.jpg');

在matlab中执行上述脚本文件,看是否发送邮件

以下四步是进行电脑跟踪:程序代码如下:

第一步:设置自己的相片(注意所有操作都是在你matlab当前目录下)

1
2
3
4
5
6
7
8
obj = videoinput('winvideo');
h=preview(obj);
set(gcf,'Visible','off')
set(h,'Visible','on')
start(obj);
pause(10) % 如果你的电脑调用摄像头的时间非常短,可以不用这句
photo=getsnapshot(obj);
imwrite(photo, 'yourpicture.jpg');

第二步:获取当前电脑前人的相片并与自己的图片进行比较,若相似度不高,则会发送当前电脑前人的相片到你指定的邮箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
%文件名为sendemail.m
clear
myaddress='sender@qq.com';
%这里sender为你发邮箱的qq号,注意你的邮箱要已经提供SMTP服务,没有也没关系,qq邮箱会提醒设置设置的mypassword='password'; %这里为你邮上面邮箱对应的密码(一般和QQ密码相同)
to = 'receiver@qq.com'; %这里为你要发送到的邮箱
setpref('Internet','E_mail',myaddress);
setpref('Internet','SMTP_Server','smtp.qq.com');
setpref('Internet','SMTP_Username',myaddress);
setpref('Internet','SMTP_Password',mypassword);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
subject ='电脑小偷'; %邮件主题

obj = videoinput('winvideo');
h=preview(obj);
set(gcf,'Visible','off')
set(h,'Visible','on')
start(obj);
pause(10) % 如果你的电脑调用摄像头的时间非常短,可以不用这句
photo=getsnapshot(obj);
imwrite(photo, 'thief.jpg')
pause(10)%如果你的电脑调用摄像头的时间非常短,可以不用这三句
photo=getsnapshot(obj);
imwrite(photo, 'thief.jpg')
a=imread('yourpicture.jpg');%这里的'yourpicture.jpg为你自己的照片
a1=rgb2gray(a);
aa=imread('thief.jpg');
aa1=rgb2gray(aa);
corr= corr2(a1,aa1);
if corr<0.85 %0.85可以自己设置0-1的范围,值越小表示两幅图很容易匹配,最好取值为0.8-0.9
sendmail(to, subject,[],'thief.jpg');
end

第二步:将step2中的程序编译生成exe文件

可以直接上网找到方法,我在这里示范一种,操作如下:首先去掉黑框: 在命令窗口输入:cd(prefdir) edit compopts.bat在打开的文件最后添加以下语句(前提是在下面图解的安装编译器选择的是vc编译器,若选择其它编译器,自己百度方法): set LINKFLAGS=%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup

编译器的安装如下图:

图1

mcc -m sendemail (sendemail 为step2中的文件)这一命令可能会编译几分钟,请耐心等待,执行完后会生成sendemail.exe文件

第四步:创建任务计划

右击我的计算机,单击管理,在左边栏中选中“任务计划程序”。在右边栏中选中“创建任务“,弹出创建任务对话框,为任务填个名称,勾选下方隐藏,配置选为,windows7那一项,触发器选项卡中单击“新建”,选择“登录时”,“每天”,勾选延迟任务,设定延迟时间为3分钟,确定。“操作”选项卡,单击新建,选择“启动程序”,单击“浏览”,选择matlab目录下生成的exe文件,确定。“条件”选项卡中只需勾选“只有在以下网络连接可用时才启动”,然后在下拉列表中选择“任何连接”(这个设置很重要,只有在电脑联网的情况下才能发送邮件),确定。后面两个选项卡,自己看样子办。然后注销用户重新登录。在三分钟内连接上网络,三分钟后,程序会自动运行,整个过程结束。

程序说明:由于程序中有preview,导致拍摄图像时会显示出窗口,容易被小偷发现,如果你的摄像头启动十分快可以将Step2中的程序改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
clear
myaddress='sender@qq.com';
mypassword='password';
to = 'receiver@qq.com';setpref('Internet','E_mail',myaddress);
setpref('Internet','SMTP_Server','smtp.qq.com');
setpref('Internet','SMTP_Username',myaddress);
setpref('Internet','SMTP_Password',mypassword);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
subject ='电脑小偷';

obj = videoinput('winvideo');
%h=preview(obj);
set(gcf,'Visible','off')
%set(h,'Visible','on')start(obj);
pause(2);
photo=getsnapshot(obj);
imwrite(photo, 'thief.jpg')
a=imread('yourpicture.jpg');
a1=rgb2gray(a);
aa=imread('thief.jpg');
aa1=rgb2gray(aa);
corr= corr2(a1,aa1);
if corr<0.85
sendmail(to, subject,[],'thief.jpg');
end

上面程序的图像匹配不准确,希望在以后通过图像识别来精确地辨别电脑主人。在Step4中你也可以根据自己的需求改变任务创建计划,比如说,设置在每天的具体时间点启动任务,获取图像并发送。在这种情况下,就没有必要进行图像匹配了,就可以只使用本文最前面的一段程序就可以了。

本文是利用蒙特卡罗算法对马氏链过程的模拟。假设有10个状态,从每个状态到与之相邻状态的概率是相同的,仿真次数为1000,及进行了1000次状态转移。我们以动画的形式再现了状态转移的过程,并记录了到达每个状态的次数,具体实现如下:

阅读全文 »