找回密码
 FreeOZ用户注册
楼主: 四香油饼
打印 上一主题 下一主题

[菜鸟学堂] qt学习笔记

[复制链接]
31#
发表于 12-1-2009 21:02:37 | 只看该作者
关于4,这个其实和C/C++的函数调用是一样的。函数调用的参数个数可以不和函数的定义一致。但是不鼓励这样的行为,容易出现未定义的错误。而且根据编译器和编译参数的不同,这样的行为可能被给出警告或者错误。

另外, QT中还可以把2个signals连起来, 不一定是signal和slot. 在QT4以前,signal和slot必须处在同一个thread中,现在没有这个限制了,可以跨thread进行signal/slot连接

评分

参与人数 1威望 +10 收起 理由
四香油饼 + 10 多谢指点

查看全部评分

回复  

使用道具 举报

32#
发表于 12-1-2009 21:11:40 | 只看该作者
关于signal/slot机制,其实是一种很通用的解偶方法。C++的signal/slot实现出了QT这个比较有名以外,还有boost实现(http://www.boost.org/doc/libs/1_37_0/doc/html/signals.html),sigslot(http://sigslot.sourceforge.net/)等. 其中那个sigslot是个专门实现c++ signal slot机制的库。像Google Talk的libjingle API (http://code.google.com/intl/zh-C ... eveloper_guide.html)就使用了这个库。

评分

参与人数 1威望 +10 收起 理由
四香油饼 + 10 这个就不懂了

查看全部评分

回复  

使用道具 举报

33#
发表于 12-1-2009 21:28:54 | 只看该作者
原帖由 coredump 于 12-1-2009 22:02 发表
关于4,这个其实和C/C++的函数调用是一样的。函数调用的参数个数可以不和函数的定义一致。但是不鼓励这样的行为,容易出现未定义的错误。而且根据编译器和编译参数的不同,这样的行为可能被给出警告或者错误。

另 ...



受益匪浅,谢谢
回复  

使用道具 举报

34#
 楼主| 发表于 13-1-2009 08:36:40 | 只看该作者
qt网站改名了,原来的trolltech.com自动跳转到了qtsoftware.com
回复  

使用道具 举报

35#
发表于 13-1-2009 11:41:30 | 只看该作者
不熟悉C++,路过。
回复  

使用道具 举报

36#
 楼主| 发表于 13-1-2009 12:02:03 | 只看该作者
原帖由 清风不写字 于 13-1-2009 12:41 发表
不熟悉C++,路过。



厚厚,好久不见阿,别来无恙乎?
回复  

使用道具 举报

37#
 楼主| 发表于 13-1-2009 15:08:48 | 只看该作者
今天回到继续跟着教程学习的路上。学习了第7章,第8章,不过第8章还没理解透彻。关于PaintEvent的概念还不是很清楚。

前面的概念基本清楚后,第7章就非常容易理解了,我看了其大概的内容,觉得比较好理解,决定不看例子,完全自己写一个类似功能的程序。

把原来的单个hello.cpp分成了几个文件,my_lcd.h头文件,用来定义my_lcd类,其具体构造函数和内部函数放在my_lcd.cpp中。记得谭浩强的书里看到过,这种把头文件和具体函数分开的方法,除了可以让结构清晰外,还可以将cpp文件编译成独立的库,可以把头文件和编译好的库提供给买家使用,而不必公开具体的实现代码。原来使用c语言时从来没有注意过这些,今后尽量锻炼自己写出结构优美的程序。

实际写的过程不太顺利,主要原因是对c++还是不够熟悉,比如派生类的定义的句法经常出错,看来还要多写,熟能生巧。另外Qt本身的类及其函数不太清楚,函数名称搞错了不少,不得以还是看了例子程序,实际作程序的话应该使用designer一类的工具应该就好多了吧,不过看来要想用好qt,必须对其提供的各种widget有个概括的了解,起码大致知道各种widget能做什么,不能做什么。

最后作了个这样的程序,用lcd和slider组成一个自定义widget,放在一个layout里面,然后再将5个widget以及一个lcd和一个按钮放在一个layout中,形成2层layout的结构,外面这层的lcd随着最后一组slider的变化而变化。

评分

参与人数 1威望 +30 收起 理由
coredump + 30 进度超快啊,是个学习的好材料,看好你!

查看全部评分

回复  

使用道具 举报

38#
 楼主| 发表于 15-1-2009 22:19:22 | 只看该作者
者两天一下子忙起来了,上班没什么时间看qt乐。不过还是看了一点点。

没有继续跟着tutor向下走,因为感觉到有些基本概念不是特别清晰。看了看QWidget的文档,因为差不多所有的Widget都是从QWidget派生出来的,QWidget有的所有的Widget都应该有。我想对QWidget了解得多一些会有好处。

看了以后发现就一个QWidget经已经有无数的properties和functions, 不过看来大体可以分为几类,一个是有关外观的,什么窗口尺寸,位置,颜色字体一类的,再一类是有关事件的,鼠标、键盘等等的各种事件,了解了一下grab类的函数和事件的区别,知道了grab就相当于把事件拦截了,不再发给其他widget。

重点看了看paintEvent(),我的理解,paintEvent()是当窗口刷新的时候触发的,应该是在现有显示清掉,新的还没有画出之前。
Widget的刷新可以由update()函数引起,也可以由比如窗口的移动等引起。

具体的用法,后面的例子里面应该有吧。
回复  

使用道具 举报

39#
 楼主| 发表于 20-1-2009 15:53:26 | 只看该作者
这些天工作忙了,晚上也没怎么学习,所以进度慢了。

对 event 还是不是特别清楚,因为例子里面只是使用了  paintEvent()这个event handler, 但是讲得很少,今天把qt文档中有关event的部分仔细看了看,才算稍微明白一点:

event 是由window环境或者程序自身发出的,qt里面,event也是一个类,通过event handler函数传递给widget, event handler是widget中已经定义好的虚函数,名称是固定的。我一开始没有弄明白的,就是这一点。event handler的大概格式是:
void QWidget::mouseMoveEvent(QMouseEvent *event)
通过event, 可以传递给widget各种信息,比如 event->x(), event->y()等。

如果我理解得不错的话,熟练掌握了Widget的各种属性和内建函数,以及event,就可以做一般的窗口应用程序了。

作为练习,我做了这个程序:颜色区域用了mouseMoveEvent,来得到鼠标的坐标,然后在paintEvent中显示出来,同时,把两者乘积作为signal发送给LCD
回复  

使用道具 举报

40#
发表于 20-1-2009 16:28:46 | 只看该作者

玩C++的,仰慕一下

IT行业里面的高端人士,潜在的中产阶级。
未来少妇、师奶和妙龄少女围追堵截的对象。
回复  

使用道具 举报

41#
发表于 20-1-2009 19:14:14 | 只看该作者

回复 #40 饭特稀,肾特虚 的帖子

做梦都想有这待遇阿
回复  

使用道具 举报

42#
发表于 20-1-2009 20:14:03 | 只看该作者
我怎么觉得会qt,离c++还远着呢~~~

评分

参与人数 1威望 +30 收起 理由
coredump + 30 我很赞同!

查看全部评分

回复  

使用道具 举报

43#
发表于 21-1-2009 14:39:03 | 只看该作者
才知道有qt这么个东西。

可以这么理解么,基于C++的一个开发平台,而且在几个流行操作系统上都有类库支持。比较适合注重性能或者和系统地层结合比较紧密的系统的开发,看例子好多都是和图形图像多媒体处理,数学计算之类的有关。这正好是java不注重的地方。

不过貌似主页上也提到了界面开发的部分,以及对java的支持。

啥时候也来弄个玩玩。
回复  

使用道具 举报

44#
发表于 21-1-2009 16:33:41 | 只看该作者

回复 #43 someonehappy 的帖子

不过貌似主页上提到了界面开发的部分,以及对java的支持。

。。。。不是,QT最重要的身份就是C++ GUI Library.
回复  

使用道具 举报

45#
发表于 21-1-2009 16:43:23 | 只看该作者
原帖由 migao21 于 20-1-2009 20:14 发表
我怎么觉得会qt,离c++还远着呢~~~

感觉正确


和C++比较近的大都在用C++写QT这类的东东呢
回复  

使用道具 举报

46#
发表于 25-1-2009 21:27:03 | 只看该作者
GTK和Qt有什么比较吗?哪位高手讲讲。
回复  

使用道具 举报

47#
发表于 25-1-2009 22:58:38 | 只看该作者

回复 #46 GPS 的帖子

GTK - GIMP Tookit  , 是一个用C写成的GUI框架,是GIMP软件和GNOME桌面环境的基础

QT - KDE的基础,著名的跨平台C++ GUI框架
回复  

使用道具 举报

48#
发表于 26-1-2009 00:40:33 | 只看该作者
gtkmm是gtk的C++ 封装,从性能上比较,它和Qt有太多区别吗?
回复  

使用道具 举报

49#
发表于 26-1-2009 00:51:32 | 只看该作者

回复 #48 GPS 的帖子

gtkmm的封装不是很成功,基本上很少有Gnome项目是用gtkmm写的。 一般而言,这类在C上面做的C++wrapper都不是很受欢迎。

性能上, GTK 和QT各有千秋, 都有不少追随者。 QT的历史比较久一点,而且现在QT已经提供了和GTK一样的LGPL许可,很多批评QT的依据已经不复存在了,我更看好QT
回复  

使用道具 举报

50#
发表于 26-1-2009 15:39:55 | 只看该作者

回复 #9 coredump 的帖子

有个疑问,Q迷和N饭们不要拍我:既然QT被Nokia收购了,是不是意味着QT的命运跟Nokia绑到了一起?个人感觉N很可能会步Moto的后尘。可能我的感觉不对,欢迎指教。

因为现在的项目也在选GUI平台/框架(用C++语言),正在比较中,主要是不想花时间去学个命不长的东东。除了QT还有什么好推荐吗?要上手快,运行速度快。(MFC不谈)
回复  

使用道具 举报

51#
发表于 26-1-2009 20:51:46 | 只看该作者

回复 #50 绿衣 的帖子

有此疑问很正常,请Google "KDE基金会", 答案尽在其中
回复  

使用道具 举报

52#
发表于 26-1-2009 20:56:02 | 只看该作者

KDE Free Qt基金会

FROM:http://www.kdecn.org/whatiskde/kdefreeqtfoundation.php
KDE Free Qt基金会成立于1998年,它由Trolltech公司KDE协会共同组建,其目的是促使Qt工具包可以为自由软件尤其是KDE桌面环境未来的开发提供有效的可持续性担保。
在Trolltech公司和本基金会间存在以下承诺,除非Trolltech公司被收购、合并或是破产,否则无论是出于什么因由,一旦Trolltech公司无法延续对Qt自由版本(Qt Free Edition)的开发,基金会被授权可以将Qt在BSD授权许可下重新发布。
在2004年5月本协议条款有所改动,新的条款替换了1998年6月的旧条款以适应当前的最新状况,这份新的文本更加明确和全面地阐述了具体操作中的一些问题,其中最重要的一项改变是,即使Trolltech公司因任何理由,甚至包括面临收购、合并或是财产清算而无法继续对Qt自由版本的开发时,本基金会仍然有权将Qt自由版本在BSD或是除此之外再附加一种或更多开源授权协议这样的条款下将其重新分发。除此以外,协议的本意和基本内容没有改变。
本基金会包括Trolltech和KDE协会的各两名成员,基金会的所有决议将由这四名成员投票产生,如果票数相同,则采纳KDE协会代表的意见为最终决定。
在KDE Free Qt基金会中两名来自KDE协会的委员为:
  • Martin Konold
  • Ian Reinhart Geiser
当前的Trolltech公司的投票代表(由Trolltech内部常务会议选举得出)为:
  • Eirik Eng
  • Haavard Nord
回复  

使用道具 举报

53#
发表于 26-1-2009 21:00:59 | 只看该作者

回复 #52 coredump 的帖子

而且Nokia收购TrollTech后,甚至增加了对商业开发更为友好的LGPL协议,使得QT可以进入更为广阔的软件开发领域。

在KDE Free QT基金会的协议里,甚至还有一条规定了QT的开发进度,如果不能在每xx(好像是12)月内推出新版本,基金会也有权把QT free到BSD License下。可以说在这样的规定下,QT已经不会受任何商业公司的绑架了,彻底Free而且发展有保障!
回复  

使用道具 举报

54#
发表于 26-1-2009 21:03:10 | 只看该作者
原帖由 绿衣 于 26-1-2009 15:39 发表
因为现在的项目也在选GUI平台/框架(用C++语言),正在比较中,主要是不想花时间去学个命不长的东东。除了QT还有什么好推荐吗?要上手快,运行速度快。(MFC不谈)


C++ GUI Framework大全, 自个儿选吧。
回复  

使用道具 举报

55#
 楼主| 发表于 29-1-2009 09:38:20 | 只看该作者
core老师,有一个地方不太理解,请给指点一下呀:

自定义的widget里面,加的那一句 Q_OBJECT是个什么东西呢?怎么觉得不太符合c++语法呢?是个宏吗?这个语句的作用还是不太理解。

我搜了下资料,好像跟meta-object有关,这个meta-object又是什么含义呢?

[ 本帖最后由 四香油饼 于 29-1-2009 10:41 编辑 ]
回复  

使用道具 举报

56#
发表于 29-1-2009 17:17:10 | 只看该作者

回复 #55 四香油饼 的帖子

Q__OBJECT的确看起来怪怪的,是QT Meta-Object System相关的一个宏定义,Meta-Object System 是QT中的一个核心概念。QT文档中的doc/html/metaobjects.html对此有详细解释。

关于Meta-Object的简单解释:

C++是静态类型的编程语言,其类型信息只在编译时有效,一旦编译成可执行文件后,里面就只剩下一大堆汇编指令了,写在源代码的那些变量,类,方法,函数等等一切的符号信息便统统消失不见了,因为是强静态类型的语言,一旦编译完成,程序的行为便完全确定了,理论上是不需要这些符号信息的。虽然debug版的可执行程序含有这些符号,不过这并不是C++标准的一部分。

但是在GUI编程领域和很多现代的软件开发实践中(比如AOP, IoC, ORM等设计模式), 在程序运行时能够访问这些写在源代码里的符号信息有很大的用处。这些符号信息用计算机术语来说就叫元数据(meta data), 意思是不是一般的程序处理的数据,而是表示程序本身的数据。 而能够访问这些自身元数据的能力叫做自省(reflection), 典型的自省能力包括:

1.可以根据运行时提供的类名字生成对应的对象实例

对一个运行时对象,
2. 能知道自己的类型名字
3. 知道自己有多少数据成员以及他们的名字,类型,并且能够根据指定的名字字符串访问他们
4. 知道自己的所有方法,并且能够根据指定的方法名字符串动态调用它们
5. 知道自己的类继承体系:从哪继承(基类信息), 被谁继承(子类信息)等

对于C#和Java这样的语言来说做到上述几点要求不是难事,因为.NET运行时和JVM标准里已经包含的完整的元数据标准和访问这些元数据的API。 但是对于C++来说做到这些就颇为困难了,但这些能力对于一个强大的GUI框架来说又是如此的有诱惑力甚至不可或缺,于是QT就扩展了C++, 提供了一个C++的元对象系统, 并且在使用C++编译器编译前先用自己的moc(meta object compiler)编译器处理一边。这样QT就能在用C++的同时享用同样强大的元数据处理能力了。 这些能力主要用在了以下方面:
1. signal slot
2. QT的属性系统
3. QT的图形界面动态加载系统 (.ui文件和uic编译器,以及qt designer能)
4. QT的QSA (QT Script系统,用Javascript访问QT对象)
5. QT的单元测试系统

等等。 可以说,整个QT框架都是建立在这个meta object system只上的。


关于这个Q_OBJECT的实现细节可以用Visual Studio跟踪器定义,实际上就是个宏,和MFC中实现消息映射的一些宏类似, 就是为类增加了一个QMetaObject成员和访问这个成员的函数(如 metaObject()). QMetaObject定义了QT meta object system 所支持的所有操作,详情见其定义。

评分

参与人数 1威望 +20 收起 理由
四香油饼 + 20 谢谢指点

查看全部评分

回复  

使用道具 举报

57#
发表于 30-1-2009 19:34:48 | 只看该作者

回复 #52 coredump 的帖子

还有这样的是,蛮有趣的。谢谢指教啦
回复  

使用道具 举报

58#
 楼主| 发表于 2-2-2009 15:35:12 | 只看该作者
遇到了一个问题,百思不得其解,还请老师指点:

我想在我定义的Widget(里面包含一些按钮等)里面画一个图形,但是为什么编译报错呢?程序如下:

class MyWidget : public QWidget
{
        Q_OBJECT
        public:
        MyWidget(QWidget *parent=0);
        protected:
        void paintEvent(QPaintEvent *event);
        private:
        int i;
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
        QLCDNumber *Disp1 = new QLCDNumber;
        QPushButton *Button1 = new QPushButton("Quit");
        MyPaintArea *Area1 = new MyPaintArea;
        QVBoxLayout *Box1 = new QVBoxLayout;
        Box1->addWidget(Disp1);
        Box1->addWidget(Area1);
        Box1->addWidget(Button1);
        setLayout(Box1);
        connect(Button1, SIGNAL(clicked()), qApp, SLOT(quit()));
        connect(Area1, SIGNAL(AreaChanged(int)), Disp1, SLOT(display(int)));
}

void MyWidget::paintEvent(QPaintEvent *)
{
        QPainter *painter(this);
        painter.setBrush(Qt::blue);
        painter.drawRect(30,-30,10,10);
}

我的目的是想在MyWidget里面画一个方块,这个方块应该是覆盖在现有的内容(比如LCDNumber, PushButton等等)上面吧?你们看我的程序什么地方有问题呢? 编译总报错:
hello.cpp:38: error: cannot convert 'MyWidget* const' to 'QPainter*' in initialization

这个第38行就是那个
QPainter *painter(this); 语句
回复  

使用道具 举报

59#
发表于 2-2-2009 16:27:34 | 只看该作者
QPainter *painter(this);

should be :

QPainter painter(this);

or
QPainter *painter = new QPainter (this);
回复  

使用道具 举报

60#
 楼主| 发表于 2-2-2009 17:01:01 | 只看该作者
哎,真是明眼人一眼就看看透,我怎么会犯这种低级错误呢,一开始想写指针那种形式,后来看例子里面是函数的,就改函数的了,但忘了前面的*号,居然还看了一下午看不出来,太笨了!
回复  

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 28-7-2026 03:09 , Processed in 0.071964 second(s), 48 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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