0%

​ 在较前面的一篇博文《C/C++基本数据类型》中,我主要介绍了c/c++的基本数据类型。我们知道C语言没有具体规定各类数据类型所占内存的字节数,只要求long型数据长度不小于int型,short型不大于int型。具体的实现如何,由各计算机系统自行决定。

​ 一般情况下,在Turbo C++中,int型和short型都是16位,而long型是32位。而有的c语言编译器给short型分配16位,而int型和long型分配32位。通常的做法是:把long型定为32位,把short型定为16位,而int型可以为16位,也可以是32位。

阅读全文 »

  1. Java中类的域共有4种访问权限,而类的访问控制级别只有public和缺省的,当为public时,可以被任何包的其他类访问,当为缺省时,只能被同一包的其他类访问。如果类自身对另一个类是不可见的,即使类的成员声明为public,也没有一个成员是可见的。
  2. Final变量一旦被显式的赋值(不能默认初始化),就不能再赋值了。
  3. 用final修辞的应用变量,不能重新引用另一个变量,但是可以所引用对象的数据。
  4. 一个类中,静态方法只能处理静态变量;静态方法只能调用静态方法。
  5. 方法修饰符abstract和final不能同时使用
  6. 每个源文件只能有一个公共类,没有公共类的源文件名可以与其中任意类同名。
  7. 子类覆盖父类的同名方法时,访问限制必须相同和更弱,但是不能更强。
  8. 子类对象可以自动向父类对象转化,但父类对象转化为子类对象时必须强制转换。
  9. 不用abstract修饰的类不能有抽象方法。
  10. Java只有单继承,即一个类只有一个直接的父类。因此Java的类层次结构是树状的,而不是网状的。
  11. Java语言的接口中,只能定义静态常量和抽象方法。接口可以看成一个没有具体实现的类。
  12. 接口可以多继承,因此接口使得Java程序实现了与类的多继承相似的功能。
  13. 如果接口中有多个抽象方法,类继承时必须为所有的抽象方法编写方法体。接口的定义中通常省略public等修饰符,但是在实现时必须显式地使用public修饰符。
  14. 如果实现接口的类是一个抽象类,则接口中的抽象方法可以不被实现。
  15. 是谁的实例调用谁的方法和变量。

  1. 高级语言的编译和执行方法可以归为两大基本技术:编译执行和解释执行。C/C++/Delphi是编译执行,basic/java/matlab是解释执行。
  2. 尽管Java是解释执行的,也需要对源文件进行编译,与c语言的全编译(生成可执行文件)不同的是,Java具有半编译、半执行的特性(生成字节码)。
  3. 字节码文件格式是与平台无关的。Java程序并不是直接在操作系统的控制之下运行,而是在JVM的控制之下运行。
  4. //是一行注释、/ /是多行注释、/* /是文档注释
  5. Java是严格区分大小写的,但html语言并不区分大小写。
  6. Java应用程序是本机上由Java解释程序激活Java虚拟机,而Java小程序是通过浏览器激活Java虚拟机。
  7. Java的命名规则
    1)包名:用小写英文单词
    2)类名和接口名:名词,每个首字母大写
    3)方法名:动词 驼峰命名
    4)变量名:与方法名一样
    5)常量名:字母全大写 单词间下划线
  8. Java语言中的字符型占16位,而c中占8位;Java中整型都是有符号的,c中有无符号的。Java中的基本数据类型的大小是固定的,而c中与平台有关。
  9. 布尔常量不能转化成任何数据类型,即不能与1、0比相等。
  10. 如果只是声明了一个类的具体对象,而没有使用构造函数,则该对象的值为null,不指向空间。
  11. Java源程序的文件名必须与public类的类名一致
  12. 判断两个字符串的内容是否相等,不能用==,只能使用字符串类的equals方法
  13. 定义一个方法时,其方法体中不能再定义其它方法;调用一个方法时,其方法体中可以再调用其它方法。即不可重复定义,可以重复调用。
  14. 一个Java源文件包含几个类定义时,只能有一个public类,文件名与public类名完全一致。
  15. 抽象类没有具体实例,最终类不能有子类

​ 学习要学会举一反三。在以前的《用matlab扫扫雷》一文中,我用matlab简单的编写了一个扫雷小程序。当然,与Windows自带的扫雷程序自然是不敢相提并论。今天我就用c++来写个扫雷程序,算是对c++的练习。在那篇文章中提过,扫雷问题是NP完全问题,不能被解决。网上也有人做过扫雷的辅助工具,但也只是指明肯定是雷、和肯定不是雷的位置,不能完全求解。下面来讲述我的程序设计思路:
1.用随机数生成雷分布的矩阵,元素为0表示无雷,1表示有雷。
2.通过循环遍历来统计一个元素的周围与之相邻的8个元素的雷的个数。
3.当鼠标左击某个按钮时,如果有雷则游戏失败。如果没有雷且其周围8个位置雷的个数为0,则将周围的8个位置打开,如果这8个位置中还有元素的周围8个元素个数为0,则将它周围的8个位置打开,依次类推……。知道将所有雷都标记正确,游戏胜利。

阅读全文 »

​ 在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt。现在大致对qt有了一些了解。但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了。本打算这学期做一个单词查询软件的,目测只有在暑假完成了,现在才刚刚完成了本地词库的查询。目前的工作解决了词库的来源、本地词典的查询功能。日后的工作还有访问网络词库、记单词的算法实现等等。下面来说一说我在本地查词功能实现的问题—显示音标!

我们知道,qt中讲的比较多的是如何显示中文。一般情况都可以用下面代码来解决:

1
2
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

但是,我们本文解决的是显示国际音标。因为当我们从词库中搜索到我们查的单词时,便会显示其音标和意思。但是有一些音标却无法显示,举例如下:

图1

图2

对比两张图就可以看出有一些音标无法显示。

由于Qt可以解析html语言,因此我们可以通过在html语言中设置字体来显示这些特殊的音标一些常用的音标有:

θ ð ʃ ʒ tʃ dʒ ŋ ɪ æ ɔ ʌ ʊ ə ɛ ɑ: ʊ: ɔ eɪ ɑɪ ɔɪ əʊ oʊ ɑʊ ɪə eə ʊə ɪə

我们可以通过下面程序来测试:

1
QString str2="<font face=\"Times New Roman\"> θ  ð  ʃ  ʒ  tʃ  dʒ  ŋ ɪ æ  ɔ  ʌ   ʊ  ə  ɛ ɑ: ʊ: ɔ eɪ  ɑɪ  ɔɪ  əʊ  oʊ  ɑʊ ɪə  eə  ʊə  ɪə</font>";

然后将上面的字符串放入Qlabel等部件进行显示,在这里就不给出具体程序了。测试结果如下:

图3

经过测试如上图,上述特殊音标都可以正常显示。学习过html语言的可以看出上面的字符串是html语言,并且将字体设置为Time New Roman。

举一反三,如果要显示其它特殊字符,只需找出其所在的字体。当然,如果你学过html,你可以在上面的语句中包含多个字体(有备无患)。

基于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

​ QStatusBar类提供一个水平条来显示状态信息。所谓状态信息,拿个简单的例子来说,当你在word中编辑时,左下角就会出现页面、字数等等信息。状态信息可以分为三类:临时信息,如一般的提示信息;正常信息,如页数;永久信息,如版本信息。QMainWindow中默认提供了一个状态栏。我们可以使用showMessage()来显示一个临时消息,它会出现在状态栏的最左边。我们一般用addWidget()将一个QLabel加到状态栏上用于显示正常信息,它会生成到状态栏的最左边,可能会被临时消息覆盖。我们使用addPermanentWidget()来添加一个QLabel来在状态栏的最右边显示永久信息。它不会被临时信息所掩盖

阅读全文 »

​ Hello World! 学习编程语言的最简单最经典的小程序,当然Qt也不例外。在学习画图时,我觉得写个时钟小程序也是个比较好的开始。在之前的《Matlab及Java小时钟》一文中,我也从写时钟程序作为学习画图的开始。三者之间的不同点在于,matlab是通过while循环来进行重绘,Java和Qt事件来处理。实时显示时钟,都是通过改变指针与坐标轴的相对位置来实现的。前两者都是改变指针,而Qt是旋转坐标轴。具体代码如下:

阅读全文 »

  • 如果程序中使用了png以外格式的图片,在发布程序时就要将Qt安装目录下plugins中的imagineformats文件复制到发布文件中。
  • 在函数声明处快速添加函数定义可单击函数名,按下alt+Enter键后,按下Enter键就可以进入到函数定义部分。
  • 关联槽和信号的两种方法:1.直接在设计器中用鼠标拖拽,适合于设计器中的部件间进行。2.在设计器中右击部件进入转到槽,这种方法是自动关联。
  • 我们在进行编程时,应注意:一个文件、一个类、一个界面。
  • 在设置文件过滤器时,在同类别不同格式间用空格,在不同类别中用;;。例如:
    QString filename=QFileDialog::getOpenFileName(this,tr(“文本对话框”),”F:”,tr(“图片文件(pngjpg);;文本文件(*txt)”));
  • Qt中凡是带有Abstract字样的类都是抽象基类。对于抽象基类,我们不能直接使用,但是可以继承该类实现自己的类,或者使用它提供的子类。
  • QlineEdit有四种显示模式:Normal正常显示输入的信息;NoEcho不显示任何输入;Password显示为密码样式;PasswordEchoOnEdit在编辑时显示为正常字符,在其它情况显示为密码样式。
  • 当部件加入到一个布局管理器中,然后这个布局管理器再放入到一个窗口部件上时,这个布局管理器以及它所包含的所有部件都会把该窗口部件自动重新定义为自己的父对象。
  • 一个主窗口只能拥有一个状态栏。
  • Qt的资源系统要求资源文件必须放在与qrc文件同级或子级目录下,如果放在其他地方,添加资源时,会提示将文件复制到有效的位置。
  • 添加资源文件后要注意保存,否则在使用时将看不到图片。
  • 往项目中添加资源文件时会自动往工程文件pro文件中添加RESOURCES+=\myImage.qrc.。其中myImage.qrc为你添加资源文件的名称。如果是添加已有的资源文件,就必须手动添加这行代码。

​ 一年前曾经用matlab的gui做了一个时钟,由于是直接用GUIDE和ActiveX控件写的,程序虽说有许多行,大多数都是自动生成的,自己写的只有十几行而已。闲着没事,就耗费了下午的时间用matlab和Java分别又写了写。具体代码如下:
1.matlab脚本文件:

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
49
%%%%%%%%%%%%%%%设置图像属性并获取图像句柄%%%%%%%%%%%%%%%%%%%%%%%%%%%
h=figure('name','我的时钟','NumberTitle','off','color',[1 1 0]);
set(h,'menubar','none','position',[200,200,400,450]);
%%%%%%%%%%%%画出时钟的外轮廓%%%%%%%%%%%%%%
s1=[0:pi/1000:2*pi];
hl=plot(2*cos(s1),2*sin(s1),'black','linewidth',1.5);
axis equal
title('我的时钟');
hold on
%%%%%%%%%%%绘制表盘刻度%%%%%%%%%%%%%%%%%%
for n=pi*2:-pi/30:pi/30 %绘制表盘,绘制分钟的刻度
a1=0.95*cos(n):0.000005*cos(n)/2:cos(n);b1=0.95*sin(n):0.000005*sin(n)/2:sin(n);
plot(2*a1,2*b1,'r-');
end
for n=pi*2:-pi/6:pi/30 %绘制表盘,绘制小时的刻度
a1=0.9*cos(n):0.1*cos(n)/2:cos(n);b1=0.9*sin(n):0.1*sin(n)/2:sin(n);
plot(2*a1,2*b1,'r-');
end
text(1.5,0,'3','FontSize',12)
text(-0.05,-1.7,'6','FontSize',12)
text(-1.7,0,'9','FontSize',12)
text(-0.1,1.7,'12','FontSize',12)
%%%%%%%%%%%%%%%%获取当前时间并进行角度与弧度转换%%%%%%%%%%%%%%%%%%%%%%%%%%%%
axis([-2.1 2.1 -2.1 2.1])
time=datestr(now);
sec=pi/2-str2num(time(19:20))*pi/30;
min=pi/2-(str2num(time(16:17))+sec/60)*pi/30;
hour=pi/2-(str2num(time(13:14))+min/60)*pi/6;
w1=-pi/30;
w2=-pi/1800;
w3=-pi/108000;
pausetime=1;
%%%%%%%%%%%%%%%%开始绘图并不断刷新%%%%%%%%%%%%
while 1
axis off
x1=0:0.75*cos(sec)/2:0.75*cos(sec);y1=0:0.75*sin(sec)/2:0.75*sin(sec); %根据秒针的位置绘制分针
x2=0:0.6*cos(min)/2:0.6*cos(min);y2=0:0.6*sin(min)/2:0.6*sin(min); %根据分针的位置绘制分针
x3=0:0.45*cos(hour)/2:0.45*cos(hour);y3=0:0.45*sin(hour)/2:0.45*sin(hour); %根据时针的位置绘制分针
hp1=plot(2*x1,2*y1,'r-','linewidth',1.5);
hp2=plot(2*x2,2*y2,'b-','linewidth',2);
hp3=plot(2*x3,2*y3,'g-','linewidth',3.5);
sec=sec+w1*pausetime; %计算一秒以后秒针的角度位置
min=min+w2*pausetime; %计算一秒以后分针的角度位置
hour=hour+w3*pausetime;
pause(1);
delete(hp1);
delete(hp2);
delete(hp3);
end

2.Java应用文件(文件名为MyClock.java)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import java.awt.*;
import java.util.GregorianCalendar;
import javax.swing.*;
import javax.swing.Timer;
import java.util.*;
import java.awt.event.*;
public class MyClock extends JPanel
{

final double RAD=Math.PI/180;//角度与弧度的转化


public void paint(Graphics g)
{
super.paint(g);//调用父类方法
Graphics2D g2=(Graphics2D)g;//主要用于改变线条粗细
int h=getSize().height;//获取窗口的长和宽,主要用于当用鼠标改变窗口时,时钟也跟着变化
int w=getSize().width;
int hour,min,sec,hh,mm,ss;
double x,y;
setBackground(Color.yellow);//设置背景值
g.setColor(Color.black);//画笔颜色
int r=(Math.min(h, w)/2-50);
float x0=w/2;//时钟中心位置
float y0=h/2;

g2.setFont(new Font("楷体",Font.PLAIN,20));
g2.drawString("我的时钟",165, 50);
g2.setFont(new Font("Times New Roman",Font.PLAIN,20));
g2.drawString("Designed by TW",235, 420);

g.drawString("12",(int)(w/2)-5,(int)(h/2)-r+30);
g.drawString("3",(int)(w/2)-25+r,Math.round(h/2)+10);
g.drawString("6",(int)(w/2),(int)(h/2)+r-20);
g.drawString("9",(int)(w/2)-r+20,Math.round(h/2)+10);

//设置分钟刻度 之所以没有用线条,主要是因为drawline的参数要求是整数,因此刻度会不准确
for(int i=1;i<=12;i++)
{
double buffer=Math.PI*(0.5-i/6.0);
int posX = (int)Math.round(x0+r*Math.cos(buffer));
int posY = (int)Math.round(y0-r*Math.sin(buffer));
g.setColor(Color.red);
g.fill3DRect(posX, posY, 8, 8, true);
}
//设置秒钟刻度

for(int i=1;i<60;i++)
{
if(i%5!=0)
{
double buffer= Math.PI*i/30.0;
int posX = (int)Math.round(x0+r*Math.cos(buffer));
int posY = (int)Math.round(y0-r*Math.sin(buffer));
g.setColor(Color.black);
g.fill3DRect(posX, posY, 6, 6, false);
}
}
//获取当前系统时间

GregorianCalendar date=new GregorianCalendar();
hour=(int)date.get(Calendar.HOUR);
min=(int)date.get(Calendar.MINUTE);
sec=(int)date.get(Calendar.SECOND);
// System.out.println(hour);
// System.out.println(min);
// System.out.println(sec);
//进行角度换算
ss=90-sec*6;
mm=90-min*6;
hh=90-hour*30-min/2;
//画出时分秒的指针
g2.setStroke(new BasicStroke(1.0f));
x=(int)(r*0.9*Math.cos(RAD*ss)+x0);
y=(int)(r*0.9*Math.sin(RAD*ss)+y0);
g.setColor(Color.red);
g.drawLine((int)(x0),(int)(y0),(int)x,(int)(h-y));

g2.setStroke(new BasicStroke(2.2f));
x=(int)(r*0.7*Math.cos(RAD*mm)+x0);
y=(int)(r*0.7*Math.sin(RAD*mm)+y0);
g.setColor(Color.blue);
g.drawLine((int)x0,(int)y0,(int)x,(int)(h-y));
g2.setStroke(new BasicStroke(3.4f));
x=(int)(r*0.5*Math.cos(RAD*hh))+x0;
y=(int)(r*0.5*Math.sin(RAD*hh))+y0;
g.setColor(Color.green);
g.drawLine((int)x0,(int)y0,(int)x,(int)(h-y));

}

//设置窗口大小
public Dimension getPreferredSize()
{
return new Dimension(400,450);
}
//
public static void main(String[] args)
{
Graphics g=null;
JFrame frame=new JFrame("我的时钟");
Container contentPane=frame.getContentPane();
final MyClock tw=new MyClock();
contentPane.add(tw,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
//用于画板的刷新
int delay=1000;
//创建一个监听事件
ActionListener drawClock=new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
tw.repaint();
}
};

//创建一个时间计数器,每一秒触发一次
new Timer(delay,drawClock).start();

}
}

运行结果如下图:

1.matlab时钟界面:
图1

2.Java时钟界面

图2

​ 在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即可以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口。下面我们来介绍具体的实现方法:

工程建立及功能描述:

​ 首先,我们建立Qt Gui应用,项目名TwoWindowsHandoff(可以随便取),基类选择QMainWindow。然后右击项目,添加Qt设计器界面类,类名取为logindialog。我们在这里假设一个窗口是登录对话框,另一个窗口是主界面;登录对话框有两个按钮,分别更改显示文本为login,exit;主界面也有两个按钮,分别更改显示文本为relogin,quit.。我们最终的实现功能是:程序运行时,出现登录对话框,点击login按钮进入主界面且登录对话框消失;在主界面点击relogin按钮回到登录对话框且主界面消失,点击exit按钮或quit按钮都会退出程序。

阅读全文 »