声明:本文是在学习和根据友善之臂《mini6410 Qt和Qtopia编程指南》做实验的过程中所遇到的问题和解决方法的整理和总结。
实验平台
硬件: 友善之臂smart210
软件:ubuntu10.04, qt2.2.0
1、在 Linux 终端中键入以下命令创建目录:
#mkdir /opt/FriendlyARM/mini210/linux/arm-qtopia/myqt_apps
在myqt_apps目录下创建 mycalc 作为本示例的项目目录
#cd /opt/FriendlyARM/mini210/linux/arm-qtopia/myqt_apps
# mkdir mycalc
2、使用 designer 工具设计图形界面
Qt/Qtopia 都带有 designer 工具,可以设计所见即所得的图形界面,我们现在就使用 designer 工具来设计 mycalc 程序的主界面,主 界面将保存成名为 main_form_base.ui 的 ui 文件1,输入如下命令启动 designer 工具,并以 ui 文件名作为参数
# cd mycalc
# /opt/FriendlyARM/mini210/linux/arm-qtopia//qtopia-2.2.0-FriendlyARM/qt2/bin/designer main_form_base.ui
# /opt/FriendlyARM/mini210/linux/arm-qtopia//qtopia-2.2.0-FriendlyARM/qt2/bin/designer main_form_base.ui
在弹出的 New Form 界面中,选择“Widget”然后点击”OK“,
修改窗口大小、添加控件、设置控件属性、控件名、添加控件的slot函数
3、编写代码
包括三个源文件(main_form.cpp、main.cpp、main_form.h), 一个项目文件(mycalc.pro),一个编译脚本(分别用x86版和arm版,看程序 在什么平台运行)
main.cpp代码:
#include "main_form.h"
#include <qtopia/qpeapplication.h>
QTOPIA_ADD_APPLICATION("mycalc”,TMainForm)
QTOPIA_MAIN
#include <qtopia/qpeapplication.h>
QTOPIA_ADD_APPLICATION("mycalc”,TMainForm)
QTOPIA_MAIN
main_form.h代码:
#ifndef __MAIN_FORM_H__
# define __MAIN_FORM_H__
#include "main_form_base.h"
#include <qsocketnotifier.h>
# define __MAIN_FORM_H__
#include "main_form_base.h"
#include <qsocketnotifier.h>
class TMainForm: public TMainFormBase
{
Q_OBJECT
public:
TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel) :TMainFormBase(parent,name,f) {}
virtual ~TMainForm() {}
public slots:
void calcButtonClicked();
void closeButtonClicked();
Q_OBJECT
public:
TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel) :TMainFormBase(parent,name,f) {}
virtual ~TMainForm() {}
public slots:
void calcButtonClicked();
void closeButtonClicked();
};
#endif
#endif
main_form.h 文件中包含了 main_form_base.h 头文件,这个 main_form_base.h 头文件不需要
用户编写,编译时由 uic 编译器根据 main_form_base.ui 文件自动生成的。
用户编写,编译时由 uic 编译器根据 main_form_base.ui 文件自动生成的。
main_form.cpp代码:
#include "main_form.h"
#include <qlineedit.h>
void TMainForm::calcButtonClicked()
{
m_result->setText( "" );
if (m_x->text().isEmpty() || m_y->text().isEmpty())
#include <qlineedit.h>
void TMainForm::calcButtonClicked()
{
m_result->setText( "" );
if (m_x->text().isEmpty() || m_y->text().isEmpty())
{
return ;
}
return ;
}
bool ok = false;
int x = m_x->text().toInt(&ok);
if (!ok)
int x = m_x->text().toInt(&ok);
if (!ok)
{
m_x->setText("");
return ;
}
ok = false;
int y = m_y->text().toInt(&ok);
if (!ok)
m_x->setText("");
return ;
}
ok = false;
int y = m_y->text().toInt(&ok);
if (!ok)
{
m_y->setText("");
return ;
}
m_result->setText( QString::number( x + y ) );
}
m_y->setText("");
return ;
}
m_result->setText( QString::number( x + y ) );
}
void TMainForm::closeButtonClicked()
{
close();
}
CONFIG += qtopiaapp
CONFIG -= buildQuicklaunch
HEADERS = main_form.h
SOURCES = main_form.cpp main.cpp
INTERFACES = main_form_base.ui
TARGET = mycalc
上面的项目文件中, CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序, HEADERS 和
SOURCES 列出了 mycalc 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件名为
mycalc, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不是应用程序
插件。
PC 版本的编译脚本 buildhost.sh
#!/bin/sh
source /opt/FriendlyARM/mini210/linux/x86-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv
qmake -o Makefile.host -spec qws/linux-generic-g++ *.pro
make -f Makefile.host clean
make -f Makefile.host
source /opt/FriendlyARM/mini210/linux/x86-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv
qmake -o Makefile.host -spec qws/linux-generic-g++ *.pro
make -f Makefile.host clean
make -f Makefile.host
如果 无法执行脚本就使命令分条执行,运行完之后生成mycalc可执行文件
(4)运行mycalc
运行./run,使得模拟器运行起来
Qtopia 运行起来后,并进入系统后,输入如下命令运行 mycalc:
# cd /opt/mini6410/qtopia2_apps/mycalc
# export QTDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/
# export QPEDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/
# export HOME=$QPEDIR/root/
# export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBARAY_PATH
# ./mycalc
以上是PC版的qt程序开发流程
# cd /opt/mini6410/qtopia2_apps/mycalc
# export QTDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/
# export QPEDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/
# export HOME=$QPEDIR/root/
# export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBARAY_PATH
# ./mycalc
以上是PC版的qt程序开发流程
接下来是编译出在ARM上运行的程序
在arm-qtopia目录下编写一个脚本 buildarm.sh 来执行 ARM 版本的编译工作,
#!/bin/sh
source /opt/mini6410/qtopia-free-2.2.0/setQpeEnv
qmake -spec qws/linux-arm-g++ -o Makefile.target *.pro
make -f Makefile.target clean
make -f Makefile.target
source /opt/mini6410/qtopia-free-2.2.0/setQpeEnv
qmake -spec qws/linux-arm-g++ -o Makefile.target *.pro
make -f Makefile.target clean
make -f Makefile.target
运行脚本后会生成mycalc可执行文件,可通过命令行来运行程序。
在实验的过程中,在pc的串口命令行通过直接运行 ./mycalc会提示找不到库文件的路径,但是在arm板上直接在中端输入是可以运行起来的,奇了怪了。怎么让程序在串口的控制台的命令行让他跑起来,在板子上输入命令太麻烦。可以这样:
#cp /bin/qtopia /opt/Qtopia/bin/run_my_calc
修改最后一行
exec $QPEDIR/bin/qpe 1>/dev/null 2>/dev/null
为exec $QPEDIR/bin/mycalc 1>/dev/null 2>/dev/null
为exec $QPEDIR/bin/mycalc 1>/dev/null 2>/dev/null
然后运行 ./run_my_cacl 就可以看到qt界面在arm的板子上运行了。
老通过命令行来运行也不是个办法。
得加个图标,直接点击图标就运行程序才行。
选取或设计一png格式的图像文件作为图标,命名为mycalc.png
编写一个desktop文件
命名为mycalc.desktop
文件的内容为
[Translation]
File=QtopiaSettings
Context=mycalc
Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate
hyphenation
[Desktop Entry]
Exec=mycalc
Icon=mycalc
Type=Application
Name[]=My Calculator
CanFastload=0
File=QtopiaSettings
Context=mycalc
Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate
hyphenation
[Desktop Entry]
Exec=mycalc
Icon=mycalc
Type=Application
Name[]=My Calculator
CanFastload=0
把desktop文件放入 /opt/Qtopia/apps/Applocations/目录下,png图标放入opt/Qtopia/pics目录下,可执行文件放/opt/Qtopia/bin目录下,开机可以看到该图标,电机即可运行。
(实验过程中发现,开机后多了一个有问号的图标,点击后提示找不到定义的应用)
解决的办法就是复制一个原先系统中有的desktop文件,在此基础上就行修改,最终的desktop文件如下
[Desktop Entry]
Comment[]=My calc
Exec=mycalc
Icon=mycalc
Type=Application
#MimeType=audio/*
Name[]=My calculator
[Translation]
File=QtopiaApplications
Context=mycalc
Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate hyphenation
Comment[]=My calc
Exec=mycalc
Icon=mycalc
Type=Application
#MimeType=audio/*
Name[]=My calculator
[Translation]
File=QtopiaApplications
Context=mycalc
Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate hyphenation
保存,重启,一切搞定。