1. 安装qt-embdedded-free-3.3.5 for x86
cd qt-x86
export QTDIR=$PWD
./configure qvfb-thread
make
2. 安装qt-x11--free-3.3.5:(为了获得uic工具)
cd ../
tar zxvf qt-x11-free-3.3.5.tar.gz
mv qt-x11-free-3.3.5 qt-x11 (改名字,为了方便,不改无所谓)
cd qt-x11
export QTDIR=$PWD
./configure -thread
make
make –C tools/qvfb
cp tools/qvfb/qvfb bin/
cp tools/qvfb/qvfb ../qt-x86/bin
3. 安装qt-embdedded-free-3.3.5 for arm
cd ../qt-arm
cp /usr/local/arm/3.4.1/bin/arm-linux-g++ /bin (这一步好像不要也行,还是加上吧)
cp ../qt-x11/bin/moc bin/
export QTDIR=$PWD
export QTEDIR=$QTDIR
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QWS_KEYBOARD=MKBD:/dev/mykeyboard
./configure -embedded arm -qt-gfx-qvfb -qt-kbd-mykbd -depths 4,8,16,32 -thread -no-cups
gmake 这里提示用gmake,我试过,用make也是可以的
编译成功后就可以在lib目录下发现我们要的四个库文件啦。
三.接下来的工作到开发板上了
我的驱动程序见附件,主要注意的地方是返回值要是char型,当然也可以是其他类型,你qt/e源码里的read()函数作相应的修改就行了,第二是要实现poll()函数,这里qt/e的工作原理有关,具体请参考倪继利的<<Qt及Linux操作系统窗口设计>>。
这里假设你的驱动程序已经移植好了,名字为mini2440_key.ko,那就赶快进加裁它吧。
insmod mini2440_key.ko
mknod /dev/mykeyboard c XX XX
注意这里名字必须为mykeyboard,原因相信你看了qt/e源码修改的部分就知道了,当然你也可以另取名字,不过qt/e源码部分也要作出相应的修改。
四.arm 上qte程序的运行:
先给出一个测试程序吧:
#include "form.h"
#include <qapplication.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qnamespace.h>
#include <qlayout.h>
MainForm::MainForm(QWidget *parent, const char *name): QWidget(parent, name)
{
setFocusPolicy(QWidget::StrongFocus);//设置可以获得键盘输入
label = new QLabel("wait for key", this);
button1 = new QPushButton("ok", this);
button2 = new QPushButton("exit", this);
button3 = new QPushButton("hello", this);
button4 = new QPushButton("goobye", this);
QGridLayout *mainLayout = new QGridLayout(this);
button1->setFocus();
button2->installEventFilter(this);
mainLayout->addMultiCellWidget(label, 0, 0, 0, 1);
mainLayout->addWidget(button1, 1, 0);
mainLayout->addWidget(button2, 1, 1);
mainLayout->addWidget(button3, 2, 0);
mainLayout->addWidget(button4, 2, 1);
//connect(button2, SIGNAL(clicked()), qApp, SLOT(quit()));
}
bool MainForm :: eventFilter(QObject *target, QEvent *event)
{
if (target == button2)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent =(QKeyEvent *)event;
if(keyEvent->key() == Qt::Key_Enter)
{
qApp->quit();
return true;
}
}
}
return QWidget::eventFilter(target, event);
}
void MainForm :: keyPressEvent(QKeyEvent *k)
{
int keycode = k->key();
qDebug("keyPressEvent keycode = 0x%x/n, the key is :",keycode);
switch(keycode)
{
case Qt::Key_Tab:
qDebug("TAB/n");
label->setText("tab is pressed");
break;
case Qt::Key_BackTab:
qDebug("BackTAB/n");
label->setText("backtab is pressed");
break;
case Qt::Key_Enter:
qDebug("Enter/n");
label->setText("Enter is pressed");
break;
case Qt::Key_Return:
qDebug("Return/n");
label->setText("return is pressed");
break;
case Qt::Key_Right:
qDebug("Right/n");
label->setText("right is pressed");
break;
case Qt::Key_Left:
qDebug("LEFT/n");
label->setText("left is pressed");
break;
case Qt::Key_Up:
qDebug("UP/n");
label->setText("up is pressed");
break;
case Key_Down:
qDebug("Down/n");
label->setText("down is pressed");
break;
default:
qDebug("Unkonw Key/n");
}
QWidget::keyPressEvent(k);
}
功能是当你当下一个键时,label会显示他按的是什么键,在exit上按确定键后,程序退出
后面我发现 case Qt::Key_Tab:和 case Qt::Key_BackTab:没有响应,看了C++ GUI Qt3 之后知道原因是这两个按键事件在evnt()事件中被处理了。
具体程序的执行请参考其他两篇文章,按键驱动和测试程序见附件。
注意的是,如果提示缺少库文件,一一从/usr/local/arm/3.4.1/arm-linux/lib 复制到开发板上的lib中就行了
还有环境变量通过直接输入:
export QTDIR=$PWD
export QTEDIR=$QTDIR
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QWS_KEYBOARD=MKBD:/dev/mykeyboard
如果保存为脚本文件,如setenv
则需要执行. ./setenv 来执行注意第一个“.”后有个空格
或者 source ./setenv,否则环境变量设置不正确。
要想去掉LCD屏上光票,可以修改源代码
src/kernel 目录下的 qwindowsystem_qws.cpp中的openMouse()函数
void QWSServer::openMouse()
{
...
#ifndef QT_NO_QWS_CURSOR
//setCursorVisible( needviscurs );
setCursorVisible( FALSE ); //changed by zhang to hide the cursor
#endif
}