Foundations of Qt Development 学习笔记 Part1 Tips1-50

1. 信号函数调用的时候仅仅会发送出信号,所以不需要执行 ,所以对于信号声明就行,但是不需要进行定义。

 

2. 只有槽函数可以声明为public,private,或者是protected的,而信号不行。可以将slot仅仅看成是一个与信号相关联的成员函数。

 

3. Qt的元对象指的是QMetaObject的实例,Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运行时的类型信息和 动态属性系统。虽然你使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的, 但是如果Q_OBJECT宏没有被使用,那么这里的信号和槽以及其它特征描述都不会被 提供。根据元对象系统的观点,一个没有元代码的QObject的子类和它含有元对象代 码的最近的祖先相同。举例来说就是,className()将不会返回你的类的实际名称, 返回的是它的这个祖先的名称。我们强烈建议QObject 的所有子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性。

 

4. 注意是QObject::connect,

 

5. 在连接信号与槽的时候不应该将具体的参数名写出来,只写上参数类型就行了。如果写了参数名的话程序会出错。

 

6. QMake处理了元对象的生成,并且将他们包含在了最终的程序之中。

 

7. moc寻找包含Q_OBJECT的类并且为这些类生成元对象,这些元对象随后会被链接到最终的程序之中。

 

8. 不要忘记了对于继承与QObeject的对象应该在类中加上Q_OBJECT声明。

 

9. 对于所有的图形化的Qt应用,必须有并且只能由一个application的实例。

 

10. 在Qt当中list之类的容器只要不进行修改就是隐式的共享的。所以将这些容器类作为const参数或者返回对性能来说是没有什么影响的。

 

11. 在Qt的for循环中,最好使用++前缀形式而不是后缀形式。

 

12. List中插入或者删除元素的时候正在使用的迭代器会变得无效,所以使用时应该注意。

 

13. 使用const型迭代器会让代码的开销更小以及更加安全。

 

14. QStringList类的一些典型的方法:1 list.join(“,”),在list内容之前插入逗号 2 replaceInString(“a”, “oo”),将成员中的a字符都换成 oo 字符。3 同样的与join对应的有着list.split(“,”)即按照着分隔符将一个整的字符串分成好几个存放在list中。

 

15. 怎样显示一个QMap中的对应的键和值:

foreach( QString key, map.keys() )

qDebug() << key << " = " << map[key];

 

16. 对于Map最好使用value而不是[]来取得一个键的值。

 

17. Qhash中的哈希表只要求提供==运算符,唯一的要求就是对于同样的元素应该提供相同的哈希值。

 

18. 继承于QHash的类必须至少应该定义一个operator==以及一个qHash成员函数。

 

19. 注意所有的Qt应用程序都是事件驱动的。

 

20. QApplication会进行事件的分发,这样当QPushButton收到这个事件的时候就会emit一个信号让其他的槽函数得以接受。

 

21. App.exec中的app是应用程序模版,其可以当作是所有Qt应用的起点。

 

22. 在Qt中使用布局的好处就是其可以让你随意的拖拽布局以及更换字体等等。

 

23. Qt可以在ui上面对不同的部件设置tab键查找顺序,在工具栏上面可以进行设置。

 

24. 注意,如果设计师文件叫做foo.ui,那么对应的c++文件就叫做ui_foo.h,设计的时候如果dialog的名字叫做ListDialog,那么最终结果的class就是Ui:ListDialog,放在Ui的明明空间中是为了防止与其他的非Ui的类文件名起冲突。

 

25. Qt的ui文件生成的类并不会继承于QDialog,其甚至连QObject都不是。所以应该自己定义相应的类。

 

26. 在qt程序的创建过程中可以使用单继承然后再将ui文件包含在里面,这样的程序耦合度更加低,因而十分方便修改。

 

27. GroupBox里面的部件当Group在移动时会和其一起进行移动。

 

28. 所有的部件在运行时都会得到一个大小提示,这些东西规定了其最大大小以及最小大小等等的信息,以及最大以及最小的高度等等的信息。

 

29. 用代码来编辑ui的时候,可以将要列上的东西先全部都列上,然后在用layout一步一步的添加即可。

 

30. 用代码来添加spacer可以使用addStretch()。

 

31. 注意,用代码的方法来添加一个addWidget布局的时候,事实上是将不同的部件分配了不同鸽子数目。示例代码为:

1 QGridLayout layout(&widget);
2 layout.addWidget(new QPushButton(“foo”), 0, 0, 1, 2);
3 layout.addWidget(new QPushButton(“Bar”), 1, 0);
4 layout.addWidget(new QPushButton(“baz”), 1, 1);

 

32. 如果想要让一个pushButton可以在按下与释放两种状态之间相互切换,那么应该将pushButton的checkable属性设置成true。

 

33. 注意以后发现没有界面自动退出的问题的时候,记得去检查所有的组建是否已经用new来声明过了,自动退出往往都是内存方面的问题。

 

34. 注意当那个布局声明的所处的位置的时候应该要使用QHBoxLayout(this)来声明,注意这个this是很重要的。

 

35. 如果出现有着no such slot的错误,那么可以去尝试下看看有没有如下几种错误:

1、看类声明中有没有Q_OBJECT

2、看slot函数有没有声明

3、查看slot有没有出现拼写错误

 

36. Qt当出现undefined reference to vtable for sth的时候应该尝试将debug以及release文件夹删掉之后应该就可以完成了。

 

37. Qt出现QT:connect was not declared in this scope 的原因是因为可能在main函数中使用connect时候没有加上QObject,在main函数当中是必须加上的,但是在其他函数当中就没有必要加上,因为其他的类可以直接使用属于自己的connect函数。

 

38. 注意,将文本设置成”E&xit”,这样键盘的快捷键为Alt+X。

 

39. QButtonGroup中放置radiobutton的时候防放置一组,只能有一个是选中的状态。

 

40. 如过想要禁用一个groupbox中的某些选项,可以使用groupbox的checkable属性。

 

41. QListWidget中含有这addItem(const QString &)以及addItem(const QStringList &)两种函数,以及currentTextChanged(const QString &)和currentItemChanged(QListWidgetItem * , QListWidgetItem * )两种信号。

 

42. 注意以后当出现QDialog is private 的时候, 应该看看是否将应该声明为指针的对象声明成了指针对象。

 

43. 在Qt的getSaveFileName这个函数中,选择文件类型的时候如果想要选择全部的类型那么使用*.*就可以完成。

 

44. QMessageBox::information, QMessageBox::warning, QMessageBox::critical的参数以及窗口几乎都是相同的,只不过在系统中他们的提示声音以及提示声音是不相同的。

 

45. 将mainwindow的属性设置成Qt::WA_DeleteOnClose可以有效的防止内存泄漏。

 

46. 在更改textEdit的文本信息之后被modified的应该是TextEdit的document()部分,这里的textdocument才是管理文本的内容以及格式属性的,而textEdit仅仅只是一个编辑器加上视窗,所以不可能是它发生了改变而应该是document()。

 

47. QAction类别,当一个QAction被使用的时候都会触发一个triggered()信号或者是toggled(bool)的信号。

 

48. qApp是一个全局指针,用他可以调用一些有用的东西,记得应该先包含QApplication。

 

49. 由于一个单窗口文本文件的关闭十分麻烦,有很多种不同的情况,例如关闭主窗口以及计算机关闭等等的情况,所以应该试图的去使用Qt提供的QCloseEvent去写出关闭事件。

 

50. 对于closeevent的accept(),其会使窗口关闭。而ignore()则会使忽略消息窗口不关闭。

posted @ 2015-10-13 12:44  eversliver  阅读(492)  评论(0编辑  收藏  举报