|
—
本帖被 XChinux 设置为精华(2016-02-20)
—
Foundations_of_Qt_Development.zip (5424 K) 下载次数:30 感兴趣的同学可以 下载阅读 英文一直不好,有 错误的地方请多指正; Chapter 1 The Qt Way of C++ 1.信号、槽和元对象的定义: Signal:是被发出而不是被执行的,这一点和现实生活中的信号很相似。程序员只需要在类中声明信号的原型,而不必实现它。记住信号只是被发出的就行了。 slot : 是信号发出后执行的函数。一个信号可以和多个slot连接。 Meta-Object:元对象中,元是本来自己的意思。这里是指元对象是描述对象的一个对象。Q_OBJECT属于元对象,当然本身包括了Signal和slot的定义。 2.信号、槽到底是如何实现的: 总体上来说是用函数指针来实现的。当发送一个信号的时候(其实信号对应的函数是由qt自己实现的),其实的调用了moc实现的函数(关于信号),这个函数使用元对象将执行连接的slot函数。 元对象包含一个函数指针,包含了一个列表使得信号的名字和参数与slot一一对应。当connect函数调用的时候,就将slot函数加入到信号列表中。如果参数匹配成功就立即执行该slot函数。3.对象继承至QObject,在构造函数中需要创建QObject *parent = 0 并赋值为0,当对象被删除的时候,该类对象自动删除。 4.要显示调试信息,需要包含QDebug 并使用qDebug() << ..... 使用qFatal() 将显示并终止程序 使用qWarning() 显示警告 使用define QT_NO_DEBUG_OUTPUT关闭所有调试信息4.QT中能使用两种迭代器:Java风格和STL风格如下: Jave风格: QListIterator<int> javaIter( list ); while( javaIter.hasNext() ) qDebug() << javaIter.next(); 其中hasNext()遍历容器中每一个有值的项目,next读取当前项目,并将迭代器指示到下一个项目中 STL风格: QList<int>::const_iterator stlIter; for( stlIter = list.begin(); stlIter != list.end(); ++stlIter ) qDebug() << (*stlIter); 当使用for循环的时候,偏向于使用前缀(++迭代器),这时候编译器就不会创建零时的变量,能节省时间 两种方式中Java更容易阅读和理解,STL的执行效率略高。建议使用java风格 注意:为了创建更易读的代码,推荐广泛使用 typedef QList<MyClass> MyClassList typedef QList<MyClass>::Iterator MyClassListIterator 需要更改容器中的内容的时候,使用QMutableListIteratorQMutableListIterator<int> javaIter( list );while( javaIter.hasNext() ) { int value = javaIter.next() + 1; javaIter.setValue( value ); qDebug() << value; } QList<int>::Iterator stlIter; for( stlIter = list.begin(); stlIter != list.end(); ++stlIter ) { (*stlIter) = (*stlIter)*2; qDebug() << (*stlIter); }5.List的追加操作:总结:QHash 和 QMap章节的后面部分没有看懂。完成阅读后重新学习一下。1.类以大写字母开头,属于QT的类以Q为前缀;2.函数方法是小写字符开头,后面的单词首字符大写;3.slot和普通的函数一样,而signal只需要你声明就Ok,他的实现就交给元对象吧;4.connect函数不会处理具体的参数值,只是管理参数类型;5.当需要使用signal和slot的时候,必须要继承QObject在类的声明中也要加入Q_OBJECT这是为了告诉元对象(meta-object)这个类需要元对象的帮助; 本章还介绍了很多类:QString,QList, QLinkedList, QVector,QQueue QStack......
|