当前位置:  编程技术>移动开发
本页文章导读:
    ▪去掉状态栏和上面视图之间的阴影        去掉状态栏和下面视图之间的阴影 <style name="Theme.IOSched" parent="android:style/Theme.Light">     <item name="android:windowNoTitle">true</item>     <item name="android:windowContentOverlay">@null</item.........
    ▪ Qt Creator兑现文本编辑        Qt Creator实现文本编辑 声明:本文原创于yafeilinux的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 前面已经将界面做好了,这里我们为其添加代码,实现文本编辑的功能。 首先实现新.........
    ▪ BluetoothSocket建立相关蓝牙通讯的套接字       BluetoothSocket建立有关蓝牙通讯的套接字 前面两篇文章中我们提到了有关Android平台蓝牙的配对、发现、启用等操作,本文开始通过BluetoothSocket类建立有关蓝牙通讯的 套接字。从Android 2.0开始支.........

[1]去掉状态栏和上面视图之间的阴影
    来源: 互联网  发布时间: 2014-02-18
去掉状态栏和下面视图之间的阴影

<style name="Theme.IOSched" parent="android:style/Theme.Light"> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
</style> 

1 楼 tony_yangzhi 2011-04-02  
咋用呢?在layout的style属性里设置,还是应该在那里呢?
2 楼 liang86liang 2011-07-11  
<activity android:name=".AboutActivity" android:theme="@style/Theme.IOSched"></activity>
3 楼 zx1326687 2011-11-16  
貌似没用啊!
4 楼 enestzhang 2011-12-01  
很好,找了很久要把title下的阴影去掉,还是iteye的文章给力
5 楼 yx1989 2012-01-31  
在values里定义style,然后在application里引用一下就醒了
6 楼 yx1989 2012-01-31  
tony_yangzhi 写道
咋用呢?在layout的style属性里设置,还是应该在那里呢?

在values里定义style,然后在application里引用一下就行了

    
[2] Qt Creator兑现文本编辑
    来源: 互联网  发布时间: 2014-02-18
Qt Creator实现文本编辑

声明:本文原创于yafeilinux的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。

前面已经将界面做好了,这里我们为其添加代码,实现文本编辑的功能。

首先实现新建文件,文件保存,和文件另存为的功能。

(我们先将上次的工程文件夹进行备份,然后再对其进行修改。在写较大的程序时,经常对源文件进行备份,是个很好的习惯。)

在开始正式写程序之前,我们先要考虑一下整个流程。因为我们要写记事本一样的软件,所以最好先打开windows中的记事本,进行一些简单的操作,然后考虑怎样去实现这些功能。再者,再强大的软件,它的功能也是一个一个加上去的,不要设想一下子写出所有的功能。我们这里先实现新建文件,保存文件,和文件另存为三个功能,是因为它们联系很紧,而且这三个功能总的代码量也不是很大。

因为三个功能之间的关系并不复杂,所以我们这里便不再画流程图,而只是简单描述一下。

新建文件,那么如果有正在编辑的文件,是否需要保存呢?

如果需要进行保存,那这个文件以前保存过吗?如果没有保存过,就应该先将其另存为。

下面开始按这些关系写程序。

1.打开Qt Creator,在File菜单中选择Open,然后在工程文件夹中打开MainWindow.pro工程文件。

先在main.cpp文件中加入以下语句,让程序中可以使用中文。

在其中加入#include <QTextCodec> 头文件包含,再在主函数中加入下面一行:

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

这样在程序中使用中文,便能在运行时显示出来了。

2.在mainwindow.h文件中的private下加入以下语句。

bool isSaved; //为true时标志文件已经保存,为false时标志文件尚未保存

QString curFile; //保存当前文件的文件名

 

void do_file_New(); //新建文件

void do_file_SaveOrNot(); //修改过的文件是否保存

void do_file_Save(); //保存文件

void do_file_SaveAs(); //文件另存为

bool saveFile(const QString& fileName); //存储文件

这些是变量和函数的声明。其中isSaved变量起到标志的作用,用它来标志文件是否被保存过。然后我们再在相应的源文件里进行这些函数的定义。

3.在mainwindow.cpp中先加入头文件#include <QtGui>,然后在构造函数里添加以下几行代码。

isSaved = false; //初始化文件为未保存过状态

curFile = tr("未命名.txt"); //初始化文件名为“未命名.txt”

setWindowTitle(curFile); //初始化主窗口的标题

这是对主窗口进行初始化。

4.然后添加“新建”操作的函数定义。

void MainWindow::do_file_New() //实现新建文件的功能

{

do_file_SaveOrNot();

isSaved = false;

curFile = tr("未命名.txt");

setWindowTitle(curFile);

ui->textEdit->clear(); //清空文本编辑器

ui->textEdit->setVisible(true); //文本编辑器可见

}

 

新建文件,先要判断正在编辑的文件是否需要保存。然后将新建的文件标志为未保存过状态。

5.再添加do_file_SaveOrNot函数的定义。

void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框

{

if(ui->textEdit->document()->isModified()) //如果文件被更改过,弹出保存对话框

{

QMessageBox box;

box.setWindowTitle(tr("警告"));

box.setIcon(QMessageBox::Warning);

box.setText(curFile + tr(" 尚未保存,是否保存?"));

box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);

if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保存操作

do_file_Save();

}

}

 

这个函数实现弹出一个对话框,询问是否保存正在编辑的文件。

 

6.再添加“保存”操作的函数定义。

 

void MainWindow::do_file_Save() //保存文件

{

if(isSaved){ //如果文件已经被保存过,直接保存文件

saveFile(curFile);

}

else{

do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为

}

}

 

对文件进行保存时,先判断其是否已经被保存过,如果没有被保存过,就要先对其进行另存为操作。

 

7.下面是“另存为”操作的函数定义。

 

void MainWindow::do_file_SaveAs() //文件另存为

{

QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);

//获得文件名

if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容

{

saveFile(fileName);

}

}

 

这里弹出一个文件对话框,显示文件另存为的路径。

 

8.下面是实际文件存储操作的函数定义。

 

bool MainWindow::saveFile(const QString& fileName)

//保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功

{

QFile file(fileName);

if(!file.open(QFile::WriteOnly | QFile::Text))

//以只写方式打开文件,如果打开失败则弹出提示框并返回

{

QMessageBox::warning(this,tr("保存文件"),

tr("无法保存文件 %1:\n %2").arg(fileName)

.arg(file.errorString()));

return false;

}

//%1,%2表示后面的两个arg参数的值

QTextStream out(&file);   //新建流对象,指向选定的文件

out << ui->textEdit->toPlainText();   //将文本编辑器里的内容以纯文本的形式输出到流对象中

 

isSaved = true;

curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路径

setWindowTitle(curFile); //将窗口名称改为现在窗口的路径

return true;

}

 

这个函数实现将文本文件进行存储。下面我们对其中的一些代码进行讲解。

QFile file(fileName);一句,定义了一个QFile类的对象file,其中filename表明这个文件就是我们保存的的文件。然后我们就可以用file代替这个文件,来进行一些操作。Qt中文件的操作和C,C++很相似。对于QFile类对象怎么使用,我们可以查看帮助。

            点击Qt Creator最左侧的Help,在其中输入QFile,在搜索到的列表中选择QFile即可。这时在右侧会显示出QFile类中所有相关信息以及他们的用法和说明。


 

 

再往下便能看到用QTextStream类对象,进行字符串输入的例子。下面也提到了QFileInfo和QDir等相关的类,我们可以点击它们去看一下具体的使用说明。


上面只是做了一个简单的说明。以后我们对自己不明白的类都可以去帮助里进行查找,这也许是我们以后要做的最多的一件事了。对于其中的英文解释,我们最好想办法弄明白它的大意,其实网上也有一些中文的翻译,但最好还是从一开始就尝试着看英文原版的帮助,这样以后才不会对中文翻译产生依赖。

       我们这次只是很简单的说明了一下怎样使用帮助文件,这不表明它不重要,而是因为这里不可能将每个类的帮助都解释一遍,没有那么多时间,也没有那么大的篇幅。而更重要的是因为,我们这个教程只是引你入门,所以很多东西需要自己去尝试。

       在以后的教程里,如果不是特殊情况,就不会再对其中的类进行详细解释,文章中的重点是对整个程序的描述,其中不明白的类,自己查看帮助。

 

 

9.双击mainwindow.ui文件,在图形界面窗口下面的Action Editor动作编辑器里,我们右击“新建”菜单一条,选择Go to slot,然后选择triggered(),进入其触发事件槽函数。


 

同理,进入其他两个菜单的槽函数,将相应的操作的函数写入槽函数中。如下。

void MainWindow::on_action_New_triggered() //信号和槽的关联

{

do_file_New();

}

 

void MainWindow::on_action_Save_triggered()

{

do_file_Save();

}

 

void MainWindow::on_action_SaveAs_triggered()

{

do_file_SaveAs();

}

 

这时点击运行,就能够实现新建文件,保存文件,文件另存为的功能了。

然后实现打开,关闭,退出,撤销,复制,剪切,粘贴的功能。

先备份上次的工程文件,然后再将其打开。

1.先在mainwindow.h文件中加入函数的声明。

void do_file_Open(); //打开文件

 

bool do_file_Load(const QString& fileName); //读取文件

 

 

 

2.再在mainwindow.cpp文件中写函数的功能实现。

 

void MainWindow::do_file_Open()//打开文件

{

do_file_SaveOrNot();//是否需要保存现有文件

QString fileName = QFileDialog::getOpenFileName(this);

//获得要打开的文件的名字

if(!fileName.isEmpty())//如果文件名不为空

{

do_file_Load(fileName);

}

ui->textEdit->setVisible(true);//文本编辑器可见

}

 

 

 

 

bool MainWindow::do_file_Load(const QString& fileName) //读取文件

{

QFile file(fileName);

if(!file.open(QFile::ReadOnly | QFile::Text))

{

QMessageBox::warning(this,tr("读取文件"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(file.errorString()));

return false;      //如果打开文件失败,弹出对话框,并返回

}

QTextStream in(&file);

ui->textEdit->setText(in.readAll());      //将文件中的所有内容都写到文本编辑器中

curFile = QFileInfo(fileName).canonicalFilePath();

setWindowTitle(curFile);

return true;

}


上面的打开文件函数与文件另存为函数相似,读取文件的函数与文件存储函数相似。

 

3.然后按顺序加入更菜单的关联函数,如下。

 

 

 

 

 

 

void MainWindow::on_action_Open_triggered()   //打开操作

{

do_file_Open();

}

//

 

 

void MainWindow::on_action_Close_triggered() //关闭操作

{

do_file_SaveOrNot();

ui->textEdit->setVisible(false);

}

//

 

 

void MainWindow::on_action_Quit_triggered() //退出操作

{

on_action_Close_triggered();     //先执行关闭操作

qApp->quit();    //再退出系统,qApp是指向应用程序的全局指针

}

//

 

 

void MainWindow::on_action_Undo_triggered() //撤销操作

{

ui->textEdit->undo();

}

//

 

 

void MainWindow::on_action_Cut_triggered() //剪切操作

{

ui->textEdit->cut();

}

//

 

 

void MainWindow::on_action_Copy_triggered() //复制操作

{

ui->textEdit->copy();

}

//

 

 

void MainWindow::on_action_Past_triggered() //粘贴操作

{

ui->textEdit->paste();

}


 

 

 

因为复制,撤销,全选,粘贴,剪切等功能,是TextEdit默认就有的,所以我们只需调用一下相应函数就行。

 

到这里,除了查找和帮助两个菜单的功能没有加上以外,其他功能都已经实现了。


    
[3] BluetoothSocket建立相关蓝牙通讯的套接字
    来源: 互联网  发布时间: 2014-02-18
BluetoothSocket建立有关蓝牙通讯的套接字

前面两篇文章中我们提到了有关Android平台蓝牙的配对、发现、启用等操作,本文开始通过BluetoothSocket类建立有关蓝牙通讯的 套接字。从Android 2.0开始支持这一特性,蓝牙和LAN一样通过MAC地址来识别远程设备,建立完通讯连接RFCOMM通道后以输入、输出流方式通讯。

  一、连接设备

  蓝牙通讯分为server服务器端和client客户端,它们之间使用BluetoothSocket 类的不同方法来获取数据,

  1. 作为服务器

   如果一个设备需要和两个或多个设备连接时,就需要作为一个server来传输,在android中提供了BluetoothServerSocket类 来处理用户发来的信息,服务器端套接字在接受(accepted) 一个客户发来的BluetoothSocket时作出相应的响应。示例代码如下:

  private class AcceptThread extends Thread {

  private final BluetoothServerSocket cwjServerSocket;

  public AcceptThread() {

  BluetoothServerSocket tmp = null; //使用一个临时对象代替,因为cwjServerSocket定义为final

  try {

  tmp = myAdapter.listenUsingRfcommWithServiceRecord(NAME, CWJ_UUID); //服务仅监听

  } catch (IOException e) { }

  cwjServerSocket = tmp;

  }

  public void run() {

  BluetoothSocket socket = null;

  while (true) { //保持连接直到异常发生或套接字返回

  try {

  socket = cwjServerSocket.accept(); //如果一个连接同意

  } catch (IOException e) {

  break;

  }

  if (socket != null) {

  manageConnectedSocket(socket); //管理一个已经连接的RFCOMM通道在单独的线程。

  cwjServerSocket.close();

  break;

  }

  }

  }

  public void cancel() { //取消套接字连接,然后线程返回

  try {

  cwjServerSocket.close();

  } catch (IOException e) { }

  }

  }

  在这里android开发网提醒大家需要注意的是服务器一般处理多个任务不嫩阻塞,必须使用异步的方法这里我们开了一个线程,目前Android的虚拟机上层没有提供I/O模型,这里我们以后会讲解高负载情况下性能优化。

  2. 作为客户端

  以便初始化一个连接到远程设备,首先必须获取本地的BluetoothDevice对象,相关的方法在我们 Android蓝牙API之BluetoothAdapter类 的两篇文章中有讲到,这里不再赘述,相关的示例代码如下:

  private class ConnectThread extends Thread {

  private final BluetoothSocket cwjSocket;

  private final BluetoothDevice cwjDevice;

  public ConnectThread(BluetoothDevice device) {

  BluetoothSocket tmp= null;

  cwjDevice= device;

  try {

  tmp= device.createRfcommSocketToServiceRecord(CWJ_UUID); //客户端创建

  } catch (IOException e) { }

  cwjSocket= tmp;

  }

  public void run() {

  myAdapter.cancelDiscovery(); //取消发现远程设备,这样会降低系统性能

  try {

  cwjSocket.connect();

  } catch (IOException connectException) {

  try {

  cwjSocket.close();

  } catch (IOException closeException) { }

  return;

  }

  manageConnectedSocket(cwjSocket); //管理一个已经连接的RFCOMM通道在单独的线程。

  }

  public void cancel() {

  try {

  cwjSocket.close();

  } catch (IOException e) { }

  }

  }

  经过上面的介绍我们可以看到在Android平台上使用蓝牙通讯相对比较方便和简单,有关数据的具体通讯我们将在下次Android蓝牙API之BluetoothSocket类(2) 讲到manageConnectedSocket的具体实现。

<!-- wordend-->

   通过前几次的讲解,很多网友相信对Android蓝牙相关开发可以很好的掌握了,通过BluetoothServerSocket可以方便的创建一个蓝 牙服务器,使用BluetoothSocket类可以很好的处理连接,今天我们继续上次的内容说下Android下如何管理蓝牙套接字的连接,今天仍然使 用BluetoothSocket类,处理具体的数据流。

  在Java上处理数据流很简单,提供了InputSream、 OutputSream和字节数组的之间的转化。今天android123将和大家一起说下处理上次遗留的manageConnectedSocket方 法的细节,由于蓝牙传输中可能存在中断,所以为了防止阻塞需要开一个工作者线程,相关的示例代码

  private class ConnectedThread extends Thread {

  private final BluetoothSocket cwjSocket;

  private final InputStream cwjInStream;

  private final OutputStream cwjOutStream;

  public ConnectedThread(BluetoothSocket socket) {

  cwjSocket = socket;

  InputStream tmpIn = null; //上面定义的为final这是使用temp临时对象

  OutputStream tmpOut = null;

  try {

  tmpIn = socket.getInputStream(); //使用getInputStream作为一个流处理

  tmpOut = socket.getOutputStream();

  } catch (IOException e) { }

  cwjInStream = tmpIn;

  cwjOutStream = tmpOut;

  }

  public void run() {

  byte[] buffer = new byte[1024];

  int bytes;

  while (true) {

  try {

  bytes = cwjInStream.read(buffer);

  mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget(); //传递给UI线程

  } catch (IOException e) {

  break;

  }

  }

  }

  public void write(byte[] bytes) {

  try {

  cwjOutStream.write(bytes);

  } catch (IOException e) { }

  }

  public void cancel() {

  try {

  cwjSocket.close();

  } catch (IOException e) { }

  }

  }

   对于具体的连接,我们看到在Android平台上使用了Java标准的输入、输出流操作,BluetoothSocket 提供的getInputStream()和getOutputStream()方法可以很好的处理我们具体的数据,完整的工程示例代码和总结我们将在下次 提供给大家。

1 楼 PointOnLine 2010-08-20  
那怎样获得已发现设备的UUID ?
2 楼 zfms 2011-03-10  
2部手机最远多远可以通讯????

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3