Warning: Cannot modify header information - headers already sent by (output started at /home/content/c/u/t/cuteqt/html/index.php:13) in /home/content/c/u/t/cuteqt/html/blog/wp-includes/feed-rss2.php on line 8
CuteQt Blog http://www.cuteqt.com/blog Qt技术分享博客 Fri, 30 Jul 2010 12:14:47 +0000 http://wordpress.org/?v=2.9.1 en hourly 1 Nokia发布Qt大使计划 http://www.cuteqt.com/blog/?p=1837 http://www.cuteqt.com/blog/?p=1837#comments Fri, 30 Jul 2010 12:14:47 +0000 shiroki http://www.cuteqt.com/blog/?p=1837 这个可能不算是很新的消息,很久以前就听人提过。不过这个计划现在才算是正式上线了!

官方主页在此:http://qt.nokia.com/qt-in-use/ambassadors/qtambassador/

简单来说,有点像前段时间推的Qt Certificate的性质, 只是certificate是针对个人的, 而这个是针对项目的。 对于Nokia本活动旨在网罗一批优秀的Qt project, 可以很好的展示和宣传Qt的酷炫功能。 对于参与的个人来说最大的好处是多了更多宣传自己的渠道, 还有可能得到官方的赞助。 可惜俺编程的水平很烂,没有能拿得出手的东西,要不然我也是show一show了。

大家如果想了解更多的信息请上官网。 另外还有一篇blog介绍这个dd的, 在此(需要youtube翻墙):

http://blog.qt.nokia.com/2010/07/20/call-for-ambassadors-qt-ambassador-program-launches/

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1837 0
在Nokia Qt SDK中开发Maemo应用 http://www.cuteqt.com/blog/?p=1828 http://www.cuteqt.com/blog/?p=1828#comments Thu, 29 Jul 2010 13:21:26 +0000 臭虫 http://www.cuteqt.com/blog/?p=1828 这是一个CuteQt参与的第一个有声博客:) 欢迎收听

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1828 2
利用QtMobility中的Location API获得位置信息 http://www.cuteqt.com/blog/?p=1821 http://www.cuteqt.com/blog/?p=1821#comments Wed, 28 Jul 2010 07:50:05 +0000 臭虫 http://www.cuteqt.com/blog/?p=1821 因为QtMobility是独立于Qt的一个模块,如果想在代码中使用QtMobility则需在.pro文件中加入下面的代码
CONFIG += mobility
MOBILITY = location bearer

第一行将QtMobility进行了使能。
第二句则将定位功能和网络连接管理(某些定位方法需要网络支持)加入编译。

除此之外,如果是Symbian系统还需为工程增加相应的几个签名能力,在.pro中加入下面内容
symbian {
TARGET.CAPABILITY += NetworkServices Location ReadUserData
}

要取得位置信息,则需要有一个位置信息提供源QGeoPositionInfoSource,该信息源可以通过下面函数获得
QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this);
每当位置信息发生变化时,QGeoPositionInfoSource都会发送一个位置更新的信号SIGNAL(positionUpdated(QGeoPositionInfo)),QGeoPositionInfo中包含了经纬度和精确度等一些信息,我们只需将该信号关联到我们的slot函数中,对数据做进一步处理即可。
connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),this, SLOT(positionUpdated(QGeoPositionInfo)));

这里是我的一个非常简单源码geoinfo,将获得的坐标信息显示在标签上,在N97上测试成功。

要保证测试成功,需要在N97上做的一点设置。
1. 如果在室外的话,不用做改动,一会就能获得数据。
2. 如果在室内做测试,需要在另外一个叫”定位“的应用中,将定位方法中的”A-GPS”和”GPS”禁止掉,只保留”使用网络定位“,则很快能够获得数据。

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1821 0
解决Fc*相关的undefined reference链接错误 http://www.cuteqt.com/blog/?p=1818 http://www.cuteqt.com/blog/?p=1818#comments Mon, 26 Jul 2010 13:36:47 +0000 shiroki http://www.cuteqt.com/blog/?p=1818 笔者最近在CentOS上编译Qt时发现了一个奇怪的链接错误, 搜索了一下发现这个问题在Redhat系列的OS里非常普遍, 包括CentOS5, RHEL4/5都有类似的问题。 典型的错误信息是(RHEL5上的):
/opt/qtsdk-2009.01/qt/lib/libQtGui.so: undefined reference to `FcFreeTypeQueryFace’
collect2: ld returned 1 exit status

像笔者使用的CentOS4, 出的错误信息就更多了, 不过也无外乎Fc开头的一系列函数。
检查了系统, fontconfig相关的库和头文件都安装好了, 按说不应该出这样的问题。 经过研究, 发现问题出在fontconfig的版本上。 原来Qt里使用到FC比较新的特性, 有些函数要在高版本的fontconfig里才能找到, 而Redhat系列的系统向来是更新慢得出了名的。 像CentOS4里的fontconfig居然还是1.0.4版, 而RHEL5里用的是fontconfig 2.1.x。 `FcFreeTypeQueryFace’ 这个函数是在2.4.2版本才引入fontconfig的。

相关的release文档: http://fontconfig.org/release/ChangeLog-2.4.2

解决的方法当然是升级fontconfig, 可以拿来fontconfig的源码包重新编译。 下载地址是:
http://fontconfig.org/release/

用新的版本覆盖掉老版本就ok了。

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1818 0
Qt程序只运行一个实例 http://www.cuteqt.com/blog/?p=1813 http://www.cuteqt.com/blog/?p=1813#comments Fri, 16 Jul 2010 10:51:39 +0000 tingsking http://www.cuteqt.com/blog/?p=1813 在我的这篇文章中使Qt程序只运行一个实例,通过QSharedMemory来实现进程间通讯,使用这种方式来是Qt程序只运行一个实例。有一天测试部的MM告诉我,她在测试的时候,程序crash掉了,再次运行程序,程序不能继续运行。

程序不能运行,显然是共享内存没有释放引起的,但是程序crash后为什么共享内存不能释放呢?于是打开Qt助手看到QSharedMemory是这样解释的:

Unix: QSharedMemory "owns" the shared memory segment. When the last thread or process that has an instance of QSharedMemory attached to a particular shared memory segment detaches from the segment by destroying its instance of QSharedMemory, the Unix kernel release the shared memory segment. But if that last thread or process crashes without running the QSharedMemory destructor, the shared memory segment survives the crash.

怎么可以这样?555…看来Nokia提供的QtSingleApplicationsolution的方法还是蛮好的。真是杯具丫,只好换QtSingleApplication,下面就介绍一下我把QSingleApplication整合到自己的应用程序中去的方法一:

1.首先从http://qt.nokia.com的网站把QtSingleApplication的源代码qtsingleapplication-2.6_1-opensource.zip下载下来,然后解压缩。假设解压缩到路径:

E:\qtsingleapplication-2.6_1-opensource

2. 编写程序代码如下:

#include <QLabel>
#include <QWidget>
#include <QMessageBox>
#include <QApplication>
#include "E:\qtsingleapplication-2.6_1-opensource\src\QtSingleApplication"

int main(int argc,char* argv[])
{
    QtSingleApplication app(argc,argv);
    if (app.isRunning())
    {
        QMessageBox::information(0, "test",
                    "An instance has already been running.");
        return 0;
    }
    QLabel label("<h2>test</h2>");
    label.show();
    return app.exec();
}

3.编译

qmake –project

qmake

nmake

链接器报告我们链接错误,链接不到QtSingleApplication的构造函数和isRunning()函数。错误很明显,编译的时候找到了QtSingleApplication的定义,但是链接器链接不到二进制符号。

4.打开刚刚生成的pro文件,加入

include(E:\qtsingleapplication-2.6_1-opensource\src\qtsingleapplication.pri)

然后qmake&nmake

这样我们的单实例程序就可以运行了,并且在linux下,当程序crash掉的时候不会存在类似sharedmemory不释放的问题。

注意:QtSingleApplication依赖于QtNetWork模块,因为其进程间通讯是通过socket来实现的,所以我们在发布程序的时候不要忘记带上QtNetWork4.dll

上面的方法虽然可以编译生成单实例程序,但是并不是我想要的最终的解决方案。因为不可能要求我的同事都下载下QtSingleApplication来,然后照着上面的说明来做,更何况大家放置QtSingleApplication的路径也不可能一样(当然可以通过make&make install把QtSingleApplication安装到Qt的路径下),总是觉得这样做会给大家带来麻烦,索性直接把QtSingleApplication的代码编译到我的工程里去算了,QtSingleApplication随着工程一起就不会存在上面描述的问题了。下面介绍方法二

介绍一下把QtSingleApplication代码编译到程序中的方法:

1. 在当前程序路径下新建文件夹qtsingleapplication和qtlockedfile。

将qtlocalpeer.cpp、qtlocalpeer.h、qtsingleapplication.cpp、qtsingleapplication.h、qtsinglecoreapplication.cpp、qtsinglecoreapplication.h拷贝到qtsingleapplication文件夹下;

将qtlockedfile.cpp、qtlockedfile.h、qtlockedfile_unix.cpp、qtlockedfile_win.cpp拷贝到qtlockedfile文件夹下

2. 修改pro文件:

win32 {

SOURCES += qtlockedfile/qtlockedfile_win.cpp

}

unix {

SOURCES +=qtlockedfile/qtlockedfile_unix.cpp

}

SOURCES += test.cpp \

qtsingleapplication/qtlocalpeer.cpp \

qtsingleapplication/qtsingleapplication.cpp \

qtsingleapplication/qtsinglecoreapplication.cpp \

qtlockedfile/qtlockedfile.cpp

HEADERS += qtsingleapplication/qtlocalpeer.h \

qtsingleapplication/qtsingleapplication.h \

qtsingleapplication/qtsinglecoreapplication.h \

qtlockedfile/qtlockedfile.h

修改刚才编写的cpp文件,将原来的include文件的路径改为相对路径。

#include "qtsingleapplication/qtsingleapplication.h"

3. 这时,运行一下qmake、nmake,出现了一大堆链接错误,仔细一看,原来是QtNetWork中的函数,昏倒,刚才还在上面提醒大家要在发布的时候包含QtNetwork4.dll,就在这里忘记包含了QtNetwork。打开pro文件,加上一句QT +=network,然后qmake、nmake恭喜,现在没有问题了。运行一下,确实是我们需要的结果。

或许你也会嫌这种方法麻烦,每次都需要改pro文件,还要包含这么多头文件和源文件,当然,我们还可以把qtsingleapplication编译成一个lib文件,在使用的时候,只需要include头文件,链接的时候把lib添加上就可以了。这个方法和方法二差不多,不同的地方在于编译静态库要在pro中使用下面参数:

TEMPLATE = lib

CONFIG +=static

相信你一定能编译出并且使用lib文件。

上面提供了使用QtSingleApplication使用的几种方法,大家可以根据自己的实际情况选择最适合自己的。

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1813 1
QPlainTextEdit获得当前光标行的行号 http://www.cuteqt.com/blog/?p=1789 http://www.cuteqt.com/blog/?p=1789#comments Thu, 08 Jul 2010 15:14:23 +0000 shiroki http://www.cuteqt.com/blog/?p=1789 textCursor();//当前行的光标 QTextLayout* lo = tc.block().layout(); //get the relative position in the block [...]]]> QTextDocument的结构之复杂是不用不知道, 一用吓一跳。 连获得光标行号这么个简单问题都要拐上七八个弯。
下面是一个比较标准的解决方案:
//get the current line number
QTextCursor tc = edit->textCursor();//当前行的光标
QTextLayout* lo = tc.block().layout();
//get the relative position in the block
int pos = tc.position() – tc.block().position();//当前光标在本block内的相对位置
int line = lo->lineForTextPosition(pos).lineNumber() + tc.block().firstLineNumber();//用block的text layout计算光标在本block的行号, 需要传入光标相对于block的位置
qWarning() << line;

还有一个有点土的方法, 但代码稍微少点, 就是计算"\n"出现的次数代替行数, 当然有可能某些情况下会出bug, 请酌情使用:
int position = edit->textCursor().position();

qDebug() << edit->toPlainText().left(position).count(“\n”);

感觉这部分API设计得很乱, 非常不符合Qt的API设计intuitive的理念, 很需要改进。

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1789 0
计算和绘制QPlainTextEdit的行号 http://www.cuteqt.com/blog/?p=1740 http://www.cuteqt.com/blog/?p=1740#comments Tue, 06 Jul 2010 08:19:44 +0000 shiroki http://www.cuteqt.com/blog/?p=1740 在Qt的example里有个例子叫做codeeditor:
http://doc.qt.nokia.com/4.6/widgets-codeeditor.html
codeeditor screenshot

该例子演示QPlainTextEdit类的用法, 其中有个有用的功能是在编辑器的左边margin的位置显示行号。 查看它的代码就会发现, 它用的时候遍历QTextBlock的方法确定行号, 这样就带来一个问题, 也就是实际上显示的所谓“行号”其实是段落号。 这在大多数情况下没什么问题, 但遇到某些bt用户非要狂按“Shift+Enter”问题就来了。

Qt的文档中可以找到对“Shift+Enter”和“Enter”行为的准确定义:

InsertParagraphSeparator Enter Enter Enter Enter (none)
InsertLineSeparator Shift+Enter Meta+Enter Shift+Enter Shift+Enter (none)

所以按下“Shift+Enter”和按下“Enter”结果是不同的。 这种不同从外表看不出来, 但和codeeditor中实现显示行号的代码结合一下, 就明白无误了。

解决的方法比较曲折(当然可能有更好的方法等着大家去探索), 除了要遍历每个block, 还要用QTextBlock的方法去遍历每个QTextLine。 另外一个让人头疼的地方是还要计算出每行的y坐标, 好在合适的地方画上这个行号。 多说无益, 代码说话:


QTextBlock block = document()->begin();
int top = 0;
QTextCursor cursor(block);
cursor.setPosition(0);//move to the beginning of the document
qWarning() << document()->lineCount() << document()->blockCount();
int linenum = 0;
while(linenum < document()->lineCount())
{
for( int i = 0 ; i < block.lineCount(); i ++)
{
QTextLine line = block.layout()->lineAt(i);
//qWarning() << line.rect().toRect() << "x,y:" << line.x() << line.y();
int dx = blockBoundingGeometry(block).x();
int dy = blockBoundingGeometry(block).y();
//qWarning()<< "block offset:" << dx << dy << "content offset:" << contentOffset();
top = line.rect().translated(contentOffset()).translated( dx,dy).y();
painter.setPen(Qt::black);
painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
Qt::AlignRight, QString::number( linenum +1));
linenum ++;
}
block = block.next();
if(!block.isValid())
{
break;
}
}

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1740 4
Qt MySQL数据库编程 http://www.cuteqt.com/blog/?p=1734 http://www.cuteqt.com/blog/?p=1734#comments Fri, 02 Jul 2010 03:47:54 +0000 chenboqiang http://www.cuteqt.com/blog/?p=1734 今天在Linux下测试了Mysql数据库与Qt结合的应用练习,Qt经常要与数据库打交道,如Oracle(甲骨文公司数据库巨人)、 SQL(中大型数据库)、mySQL(小型关系型数据库管理系统)、Access(小到办公软件的office数据库access)。经常使用的客户端数 据库驱动有ODBC、MySQL、SQLite等。现在重点介绍MySQL,默认的情况是没有安装MySQL的驱动的,只用一个SQLite嵌入式数据库 可以编写以下代码显示数据库驱动。

#include <QApplication>
#include <QDebug>
#include <QtSql>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
qDebug()<<”Available drivers:”; //输出有效的数据库驱动
QStringList drivers = QSqlDatabase::drivers(); //用字符列表的形式将SQL数据库设备驱动列出来
foreach(QString drivers,drivers); //foreach语句为数组或对象集合中的每个元素重复一个嵌入语句组,foreach语句用于循环访问集合以获取所需信息。
qDebug()<<”\t”<<drivers;
return app.exec();
}

QtSql是数据库类的集合,要使用到因此要添加模块头文件#include ,创建工程文件时也要选中Sql库,或在*.pro中的编译入口input下方添加QT += sql
QMYSQL和QMYSQL3先前是没有的,编译安装QMYSQL驱动后就有,怎么安装?

有的时候没有安装数据库,在Red Hat Linux 9.0操作系统平台下安装Mysql,如果想一次安装也行,省去安装依赖包的麻烦。插入第三张镜像盘,然后挂载到光盘挂载点上,用mount命 令:#mount /dev/cdrom /mnt/cdrom ,然后切换到存放的软件包目录,用cd命令:#cd /mnt/cdrom/RedHat/RPMS/ .接着安装rpm辅助安装工具包,用rpm命令:#rpm -ivh rpmdb-redhat-9-0.20030313.i386.rpm.安装完成以后,卸载挂载镜像盘,用umount命令,注意在当前目录是不允许卸 载:#umount /mnt/cdrom .插入第二张镜像盘,开始安装mysql数据库的客户端与服务端及MySQL常用工具包软件。挂载与上面一样用mount 命令,切换用cd命令切换到软件包存放目录,接着安装MySQL数据库软件,#rpm -ivh –aid mysql*.rpm.到此安装就大功告成。启动MySQL服务数据库初始化:#service mysqld start ,设置数据库密码用mysqladmin命令:#mysqladmin –u root password “密码” 。好了登陆测试一下#mysql –u root –p回车输入密码就可以登陆了。

这是sqldrivers设备驱动路径:cd $QTDIR/src/plugins/sqldrivers/mysql,$QTDIR是我安装QT的目录路径。

添加加下面一句重新构建Makefile文件:
qmake “INCLUDEPATH+=/usr/include/mysql” “LIBS+=-L/usr/lib/mysql -lmysqlclient_r” mysql.pro

在执行make编译源代码,最后执行make install安装。

下面是最终的现实效果如下:
现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。我的大概流程是:

<1>在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。
<2>创建一个水平布局管理器,在水平布局管理器中添加三个按钮,最后将水平布局管理器添加到栅格布局管理器中。
<3>创建三个按钮的信号与槽
<4>数据库的使用分为三步:
(1)QsqlDatabase建立数据库的链接
(2)QsqlQuery用于执行SQL语句
(3)QsqlTableModel结合QtableView可以输出数据库的表。
<5>效果测试点击connect按钮链接打开数据库

参考:http://blog.csdn.net/MicroSky2813/archive/2010/03/02/5338040.aspx
#include <QApplication>
#include “table.h”

int main(int argc,char *argv[])
{
QApplication app(argc,argv);
Table *table = new Table;
table->show();
return app.exec();
}

#ifndef TABLE_H
#define TABLE_H
#include <QDialog>
#include <QTableView>

class QGridLayout;
class QPushButton;
class QHBoxLayout;
class Table:public QDialog
{
Q_OBJECT
public:
//继承公共对话框窗体派生类
Table(QWidget *parent = 0);
//创建各个类的指针
QTableView *table;
QGridLayout *gridLayout;
QPushButton *connectButton;
QPushButton *executionButton;
QPushButton *displayButton;
QHBoxLayout *verticalLayout;
private slots:
//创建三个按钮槽函数
void on_connectButton_clicked();
void on_executionButton_clicked();
void on_displayButton_clicked();
};

#endif

#include <QtGui>
#include <QSqlTableModel>
#include <QtSql>
#include <QDebug>
#include “table.h”

Table::Table(QWidget *parent)
:QDialog(parent)
{
//创建视图及按钮的对象
table = new QTableView;
connectButton = new QPushButton(“connect”);
executionButton = new QPushButton(“execution”);
displayButton = new QPushButton(“display”);
//建立三个信号与槽函数链接
connect(connectButton,SIGNAL(clicked()),this,SLOT(on_connectButton_clicked()));
connect(executionButton,SIGNAL(clicked()),this,SLOT(on_executionButton_clicked()));
connect(displayButton,SIGNAL(clicked()),this,SLOT(on_displayButton_clicked()));
//创建一个水平布局管理器,布局三个按钮
verticalLayout = new QHBoxLayout;
verticalLayout->addWidget(connectButton);
verticalLayout->addWidget(executionButton);
verticalLayout->addWidget(displayButton);
//创建一个栅格布局管理器对整体窗口部件的排布。
gridLayout = new QGridLayout;
gridLayout->addWidget(table,0,0,1,1);
gridLayout->addLayout(verticalLayout,1,0,1,1);
setLayout(gridLayout);
//设置窗口的大小
resize(500,400);
}

void Table::on_connectButton_clicked()
{
//链接函数实现数据库的链接功能
QSqlDatabase db = QSqlDatabase::addDatabase(“QMYSQL”); //添加QMYSQL数据库驱动
db.setHostName(“localhost”); //设置登陆的主机名为localhost
db.setUserName(“root”); //登陆的用户是超级用户 root
db.setPassword(“123456″); //登陆密码是123456
db.setDatabaseName(“student”); //打开的数据库表格,这个表格式预先创建好的。用>create database student;创建。
bool ok = db.open();
//布尔类型,打开数据。
if(ok) //if判断
{
qDebug()<<”open Database!”<<endl;
//如果打开数据库在终端输出open Database信息
}
else
{
QMessageBox::critical(0,QObject::tr(“Database Error”),db.lastError().text());
//否则输出数据库的消息框错误信息
}
}

void Table::on_executionButton_clicked()
{
//按executionButton按钮执行SQL语句
QSqlQuery query;
//创建一个执行数据库SQL语句对象
query.exec(“drop table employee”);
//如果存在employee数据库表格,先删除
query.exec(“create table employee(id int(11) primary key,name varchar(50),description varchar(255))”);
//在创建数据库表格employee
query.exec(“insert into employee values(1,’zhangsan’,’student’)”);
query.exec(“insert into employee values(2,’lisi’,'teacher’)”);
query.exec(“insert into employee values(3,’wangwu’,'professor’)”);
//插入三个记录
}

void Table::on_displayButton_clicked()
{
//用数据库表格模式结合试图显示数据库内容。
QSqlTableModel *model = new QSqlTableModel;
//创建数据表模式对象
model->setTable(“employee”);
//设置数据库表上的运作模式以employee表名,不选择从数据表格以外获取信息
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//所有更改将被缓存在模型中,直到submitAll()或revertAll()函数被调用
model->select();
//select()函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。
model->setHeaderData(0,Qt::Horizontal,QObject::tr(“ID”));
model->setHeaderData(1,Qt::Horizontal,QObject::tr(“name”));
model->setHeaderData(2,Qt::Horizontal,QObject::tr(“description”));
//对应指定的字段并设置对应的水平标题显示
table->setModel(model);
//将这个数据库表格模式用视图显示出来。
}

在关闭对话框后出现查询应用默认数据库连接错误:

QSqlDatabasePrivate::removeDatabase: connection ‘qt_sql_default_connection’ is still in use, all queries will cease to work.

我google一下,参照:

http://www.cnblogs.com/codingmylife/archive/2010/04/27/1722404.html
的内容测试,还是解决不了。

在第二个按钮末尾添加下面的语句:

QString name;
{ name = QSqlDatabase::database().connectionName();}
QSqlDatabase::removeDatabase(name);

On_executionButton_clicked()函数末尾添加,执行SQL语句后关闭窗口时有效的,
但在on_displayButton_clicked()函数末尾添加却没有效。问题还在解决当中。。。。。

]]>
http://www.cuteqt.com/blog/?feed=rss2&p=1734 6
Nokia Qt SDK的远程编译功能 http://www.cuteqt.com/blog/?p=1725 http://www.cuteqt.com/blog/?p=1725#comments Tue, 29 Jun 2010 09:31:15 +0000 臭虫 http://www.cuteqt.com/blog/?p=1725 什么是远程编译

远程编译是指在客户端将源代码提交到服务器,在服务器端进行编译,将编译好的可安装程序下载到本地。 这样做有几个好处

  • 很好的兼容性。服务器端由官方维护,开发环境能够保持和手机运行环境的一致性
  • 良好的可配置性。在客户端的开发者,只需配置一下服务器的编译平台,就能够生成不同的代码。
  • 跨平台开发。 开发者无论是Windows/Mac/Linux操作系统,只需提交代码,即可得到目标平台的代码。目前Mac/Linux还不提供Symbian的编译器,但是使用远程编译你也能很方便在Mac/Linux平台下开发Symbian应用。
  • 目前Nokia Qt SDK里已经集成了远程编译,本文将介绍在Nokia Qt SDK中如何使用远程编译。

    使用远程编译

    SDK 安装选项

    要使用远程编译,需要在安装Nokia Qt SDK的时候将远程编译功能给选上,在安装类型上选择 Custom

    在安装组件中,将Remote Compiler选上

    激活远程编译

    要使用远程编译功能,需要你拥有一个诺基亚论坛帐号,然后利用它进行授权使用,配置方法: 主菜单->Tools->Options->Projects->Remote compiler

    如果配置成功,上图中Logout字样会变亮。此时当你新建一个工程的时候你会看到多出来一些”Remote Compiler”的Qt版本

    如果是已经创建好的工程,也可以通过项目的编译选项添加”Remote Compiler”的支持

    在设置了Remote Compiler支持后,可以为远程支持设置不同的Qt平台.如Maemo/S60 3rd/S60 5th等

    执行编译则和在本地编译没什么区别,点击榔头编译按钮就可以。编译完成会生成 .sis(Symbian)或.deb(Maemo)文件。可以直接安装到手机上。

    注意

    如果你的网络需要代理才能访问Internet,那么同样在配置诺基亚论坛帐号授权时,需要在那里填入代理服务器的相关信息。

    ]]>
    http://www.cuteqt.com/blog/?feed=rss2&p=1725 0
    Linux下minicom超级终端的安装及使用 http://www.cuteqt.com/blog/?p=1713 http://www.cuteqt.com/blog/?p=1713#comments Thu, 24 Jun 2010 15:02:31 +0000 chenboqiang http://www.cuteqt.com/blog/?p=1713 Minicom 的简单介绍及其使用方法

    文档整理作者:陈博强
    2010-06-23

    Minicom目录:
    <一>Minicom的简介
    <二>Minicom的安装
    <三>Minicom的串行端口的设置
    <四>Minicom的使用
    (1)minicom界面介绍
    (2)minicom的参数设置
    (3)minicom的测试

    <一>Minicom的简介

    Minicom先进系统(Minicom Advanced Systems)是一家Intel创投公司(Intel CapitalPortfolio),是针对带外服务器管理领域的数字和模拟KVM解决方案领先提供商。另外,Minicom同时也是针对数字告示领域的音视频和串口信号分配系统主导厂商。

    Minicom公司成立于1987年,总部位于以色列耶路撒冷,拥有一座3600平米的办公大楼,包括研发、市场、销售和物流等部门。此外Minicom在欧洲和美国具有区域总部,在英国、意大利、法国和德国和中国具有销售支持队伍。在2005年,Minicom收购了Replicom公司,作为专注于IP技术的研发中心。历经20年的发展以及遍及全球50多个国家的业务,Minicom的产品已经销售到上千个数据中心,无论小公司还是大型跨国企业。 Linux下的Minicom的功能与下的超级终端功能相似,适于在通过超级终端对设备的管理以及对嵌入操作系统的升级,现写出Minicom的使用手册:

    <二>Minicom的安装

    安装Red Hat Linux 9.0的自动带的minicom-2.00.0-12.i386.rpm安装包,将第一张镜像盘挂在到/mnt/cdrom临时文件系统的光盘挂载点。
    #mount /dev/cdrom /mnt/cdrom
    //挂载光盘设备
    #cd /mnt/cdrom/RedHat/RPMS/
    //切换到安装包目录
    #find minicom*
    //在当前目录查找以minicom开头的安装包
    #rpm –ivh minicom-2.00.0-12.i386.rpm
    //安装minicom超级终端软件,如果有依赖文件可先安装第三张镜像盘的辅助安装的依赖文件的安装包rpmdb-redhat-9-0.20030313.i386.rpm,执行rpm –ivh rpmdb-redhat-9-0.20030313.i386.rpm安装好后,然后切换到第一张镜像安装盘,安装minicom超级终端,用一下的命令rpm –ivh –aid minicom-2.00.0-12.i386.rpm.如果不想敲太多的代码,输入安装包的前几个字母,按Tab键进行补全命令。

    源码包方式:
    https://alioth.debian.org/frs/download.php/3195/minicom-2.4.tar.gz
    #tar –zxvf minicom-2.4.tar.gz
    //解压minicom安装包
    #cd minicom-2.4
    //切换到解压minicom-2.4目录
    #./configure
    //执行./configure检测编译所需的库函数及头文件,可以制定安装目录,如果不指定则默认安装包安装目录。最后生产Makefile文件
    #make
    //编译源代码
    #make install
    //安装编译后的软件。

    <三>Minicom的串行端口的设置
    关闭虚拟机的电源,可以在虚拟机的超级终端中输入poweroff命令,然后回车进行关闭,也可以在主菜单—关闭—关闭电源。关闭电源后,给虚拟机添加一个串口。点击虚拟机菜单栏中的虚拟机—>设置(或选中Red Hat Linux –Vmware Workstation—按Ctrl+D),就会弹出虚拟机设置对话框

    选中Hardware(硬件类型)栏,然后点击add添加一个,然后弹出一个添加硬件向导,添加硬件向导第一步,类型的硬件选择。询问什么类型硬件,你想安装。选中Serial Port(串口),点击next(下一步)

    进入添加硬件向导第二步,对串行端口类型的选择。询问什么样的媒体能访问这个端口,串口端口选中:使用位于主机上的物理串行端口。默认设置,点击next(下一步)

    进入添加硬件向导第三步,对物理串行端口选中。询问这应该是什么物理设备连接到串行端口。物理串行端口选中:Auto detect(自动检测)。设备状态:默认打开电源时链接,因此在复选框打勾.设置完以后点击finsh(完成)

    点击完成添加硬件向导后,在Hardware(硬件栏),多了一个Serial Port(串行端口)硬件设备。然后点击Ok完成设置。接着就是启动虚拟机

    <四>Minicom的使用

    (1)minicom界面介绍
    第一次运行minicom,启动minicom要以root权限登录系统,需要进行minicom的设置,输入下了命令#minicom –s,显示的屏幕如下所示,按上下光标键进行上下移动选择,我们要对串行端口进行设置,因此选中Serial port setup,然后回车:

    __[configuration]─-─—┐//配置
    │ Filenames and paths │//文件名和路径
    │ File transfer protocols│//文件传输协议
    │ Serial port setup │//串行端口设置
    │ Modem and dialing │//调制解调器和拨号
    │ Screen and keyboard │//屏幕和键盘
    │ Save setup as dfl │//设置保存到
    │ Save setup as.. │//储存设定为
    │ Exit │//退出
    │ Exit from Minicom │//退出minicom
    └──────────┘

    (2)minicom的参数设置

    选中设置串行端口,点击回车后,弹出设置的界面如下:

    点击”A”设置串行设置为/dev/ttyS0,这表示使用串口1(com1),如果是/dev/ttyS1则表示使用串口2(com 2).按”E”键进入设置”bps/par/Bits”(波特率)界面,如下图所示。再按”I”以设置波特率为115200,点”F”键硬件流控制设置为NO,回车

    最终的设置结果如下,然后回车返回到串口设置主菜单中

    │A-Serial Device(串口设备): /dev/ttyS0
    │B-Lockfile Location(锁文件位置): /var/lock
    │C-Callin Program(调入程序):
    │D-Callout Program(调出程序):
    │E-Bps/Par/Bits(): 115200 8N1
    │F-Hardware Flow Control(硬件数据流控制): No
    │G-Software Flow Control(软件数据流控制): No

    Change which setting? (改变这些设置) 然后选中”Save setup as dfl”,按回车键保存刚才的设置。如下图所示:
    在选中”EXit”退出设置模式,刚才的设置保存到”/etc/minirc.dfl”,接着进入初始化模式。

    或可以这样设置,打开终端输入minicom后,初始化进入minicom的欢迎界面,这里提示按”Ctrl+A”,再按”Z”键进入主配置目录
    按下”O”键,并选择串口配置选项进行配置。接下来的配置是一样的。解析一下minicom命令摘要,命令将被执行当你按下Ctrl+D ,Key是对应的“字母”键。

    “D”键:拨号目录
    “S”键:发送文件,上传文件有几种方式:zmodem、ymodem、xmodem、kermit、ascii
    “P”键:通信参数。对波特率进行设置。
    “L”键:捕捉开关。
    “F”键:发送中断。
    “T”键:终端设置。A-终端仿真:VT102终端B-Backspace键发送:DEL键 C-状态一致:启动D-换行延迟(毫秒):0
    “W”键:换行开关
    “G”键:运行脚本
    “R”键:接收文件
    “A”键:添加一个换行符
    “H”键:挂断
    “M”键:初始化调制解调器
    “K”键:运行kermit进行刷屏
    “E”键:切换本地回显开关
    “C”键:清除屏幕
    “O”键:配置minicom
    “J”键:暂停minicom
    “X”键:退出和复位
    “Q”键:退出没有复位
    “I”键:光标模式
    “Z”键:帮助屏幕
    “B”键:滚动返回

    配置完成后,用串口线和网线连接PC机和嵌入式QT2440开发板,启动开发板的电源,即可在linux下minicom超级终端看到启动信息,并可以执行操作控制。

    两边互ping检测网络是否通畅,(minicom超级终端)ping +IP(Linux),(Linux)ping +IP(超级终端的IP)。然后挂载在minicom超级终端输入mount -t nfs IP:/挂载目录 /挂载点如:mount -t nfs 10.88.221.60:/arm2410cl /mnt/nfs 有时挂载不成的原因归纳有几点。(1)minicom和Linux是否能够ping通 (2)确定有在/etc/exports文件中创建有挂载目录,minicom超级终端有挂载点。 (3)nfs和portmap软件是否安装,及其服务是否启动 (4)防火墙是否开发nfs端口及portmap端口111等。

    OK!测试成功!

    今天的minicom就总结使用minicom 启动minicom 在linux下通过串口连接器,实现超级终端的功能。资料主要还是靠自己总结,有部分资料来自百度。

    网址:http://baike.baidu.com/view/2911642.htm?fr=ala0_1

    ]]>
    http://www.cuteqt.com/blog/?feed=rss2&p=1713 2