找回密码
 注册
查看: 1574|回复: 11

一点基本知识

[复制链接]
发表于 2004-2-14 10:30:06 | 显示全部楼层 |阅读模式
1,        Signal和Slot。
简单地说就是信号和信号接受器,他跟callback方式的回调函数实现不一样。简单的例子:点击一个按钮,就会触发他的clicked()这个signal,另外有一个dialog,他有一个show()的slot,signal和slot都不关心自己将跟谁连接或者被谁连接。但是一个基本原则就是类型安全,参数要一致(slot的参数可以少于signal,因为它可以丢弃参数),比如如果你希望点击按钮打开对话框的话:
QPushButton *btn = new QPushButton(“打开对话框”);
QDialog *dlg=new QDialog();
connect(btn, SIGNAL(clicked()), dlg, SLOT(show()));

在举一个包含参数的例子:
QLCDNumber *lcd = new QLCDNumber();
QSlider *sl = new QSlider(Qt::horizontal);
sl->setRange(0,99);
sl->setValue(0);
connect(sl, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

2,        Q_OBJECT
这个宏在QT/KDE编程中很常见,到底是什么意思你也没有必要理会

在QT编程中,如果是自己实现的控件,比如从QVBox,QWidget,QMainWindow之类的继承而来的类,如果有自己的signal和slot实现,就要在类声明的最前面,加入Q_OBJECT这个宏,如果没有新的signal/slot定义,就不需要了。也就是如果类中存在signals: public slots:的定义就要加入这个宏。

在KDE编程中,都要加入Q_OBJECT这个宏。

3,        Moc(Meta Object System)
Moc其实就是对signal/slot机制的实现。
如果一个类声明含有了Q_OBJECT宏,他就会对这个类声明进行moc,生成一个新的C代码文件,习惯定义后缀名为moc,要包含进类实现的文件,比如在Cpp文件最后加上#include “abc.moc”或者跟类实现链接。

在Qt/KDE编程中,自己定义的signal是不需要进行实现的,只有slot需要进行实现。Singal的实现工作由moc完成。

4,        Designer和UI
Qt提供了两个工具,可以方便开发者在开发过程中使用:assistant和designer,assistant是文档中心,所有的qt类文档都可以找得到,上百个类,背不下来的,所以开发时肯定要参考文档。

Designer的功能也很容易理解,用来可视化的画UI的。但是,画出来UI之后怎么加入到你的工程呢?

其实很简单:
启动designer之后,你可以选择画widget/mainwindow/dialog/wizard等各种类型,随便画一种,生成一个UI文件,然后使用uic对他进行处理。

uic abc.ui >abc.h
uic –impl abc.h abc.ui >abc.cpp
这时候你就得到了你要构建的UI的头文件和类实现,如果是简单的任务,就可以直接加入工程了。就想自己构架的组件一样的使用。

通过designer也可以定义slot,signal什么的,建议,生成source后实现。

如果使用kdevelop,可以使用工具自动实现UI到source的转换。
     
5,        Qmake:
一个qt程序,怎么才能最方便的编译,难道moc, 编译联结之类的行为都要自己手动写?

qmake –project  生成一个目录名.pro工程文件
qmake  从目录名的pro生成makefile
make 编译生成“目录名”的可执行程序

就可以了

6,        DCOP
这个是KDE独有的东西。
Dcop就是桌面通讯协议的意思。是一个类CORBA协议,但是非常简单。
设计dcop的目的就是需要在程序之间进行通讯,举个例子:一个应用程序发送一个消息给panel,说“我已经启动,不要显示“程序启动”的等待状态了”或者一个新应用程序询问是否有同名程序正在运行。如果是,调用并创建一个新的窗口,而不是启动一个新的进程。

DCOP有两种方法:send()和call(), send是异步的,只管发送,不管接受,send函数的返回值表示send行为成功与否,call比send多两个参数,返回值类型和返回值,他是同步拥塞的,必须等待返回值。

建立DCOP的方法很简单,消息发送端需要用到dcopClient(),attach(), registerAs(),QByteArray, QDataStream, send() and call();

首先:
DCOPClient *client=kapp->dcopClient();建立client对象
client->attach(); //跟服务器取得连结。
如果只是发送,不必进行registerAs()。这时候你不能获得appId也就必须进行匿名的连结了。
registerAs返回一个唯一标示符,可以进行身份辨识;假设外部程序有一个doIt函数,接受int型参数,那么我们请求这个函数执行的方法是:

QByteArray data;
QDataStream arg(data, IO_WriteOnly);
arg << 5;
if (!client->send("someAppId", "fooObject/barObject", "doIt(int)", data))
  qDebug("there was some error using DCOP.");

   使用QDataStream的目的是为了将数据序列化。上面的someAppId就是外部接受的那个
程序使用了registerAs取得的,对象的引用必须使用完全的层次结构。



以后我会接着写DCOP, KIO, KPART, XML_GUI等等的东西,同时对panel applet, systray, kpart, DCOP, kio, KAPP编程的范例进行一些分析。
发表于 2004-2-14 12:01:28 | 显示全部楼层
期待中...
呵呵
回复

使用道具 举报

 楼主| 发表于 2004-2-14 12:08:31 | 显示全部楼层

DCOP:桌面通讯协议

翻译了一段时间了:

http://www.sound-net.com/cjacker/documents/DCOP.htm

格式乱了,有兴趣的朋友帮忙整理一下。

这是KDE DCOP协议的一份文档,刚开始可能看不懂,多看几遍。

下面我在描述一个例程就差不多了。
回复

使用道具 举报

发表于 2004-2-14 12:22:40 | 显示全部楼层
看懂了。
回复

使用道具 举报

 楼主| 发表于 2004-2-14 13:03:45 | 显示全部楼层
我敢保证,愿意看这些东西的人没几个,呵呵
回复

使用道具 举报

发表于 2004-2-14 14:08:58 | 显示全部楼层
呵呵……看了一边,没懂……
打印出来上课的时候打发时间用……
回复

使用道具 举报

发表于 2004-2-14 14:46:45 | 显示全部楼层
我不愿意看
因为我的C语言功底几乎等于0
回复

使用道具 举报

发表于 2004-2-14 20:45:50 | 显示全部楼层
呵,我有兴趣!
回复

使用道具 举报

发表于 2004-2-16 15:07:15 | 显示全部楼层
为什么外国人都喜欢用foo、bar之类的名字?
是什么意思呢?
回复

使用道具 举报

发表于 2004-2-18 19:51:26 | 显示全部楼层
foo就是什么都没有的意思吧?一般用来给demo程序取名字,bar顾名思义,就是一块板板而已,上面显示几个字……
回复

使用道具 举报

发表于 2004-2-19 15:38:41 | 显示全部楼层
如果我没有记错,foo、bar就是 1、2的意思。
也就是说什么意思都没有,只是举个例子而已,不需要去追究这个词本身的意思 。
回复

使用道具 举报

发表于 2004-2-20 10:47:02 | 显示全部楼层
foo翻译过来可以叫做“某某”
所以经常就用在demo程序里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-1-9 23:24 , Processed in 0.085854 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表