2022-01-21

        时段为20220117到20220121,这一周每天晚上下班后有时间都会看几页书,书名为《Qt5开发及实例》,下面是这一周记的笔记。

一、程序须知:

1、#include “dialog.h”: 包含了程序中要完成功能的Dialog类的定义,在Dialog类中封装完成所需要的功能。注意,使用哪个类就必须将包含该类的头文件引用过来。例如,若要用到一个按钮类时,则必须在此处添加一行代码#inlude,这表明包含了按钮(QPushButton)类的定义。

2、#include

: Application类的定义。在每一个使用Qt图形化应用程序中都必须使用一个Qapplication对象。Qapplication管理了各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等。

3、int main(int argc, char

*argv[]): 应用程序的入口,几乎在所有使用Qt的情况下,main()函数只需要在将控制转交给Qt库之前执行初始化,然后Qt库通过事件向程序告知用户的行为。所有Qt程序中都必须有且只有一个main()函数。main()函数有两个参数argcargvargc是命令行变量的数量,argv是命令行变量的数组。

4、QApplication a(argc, argv):a是这个程序的Qapplication对象,在任何Qt的窗口系统部件被使用之前创建Qapplication对象是必须的。它在这里被创建并且处理这些命令行变量,所有被Qt识别的命令行参数都将从argv中被移去(并且argc也因此而减小)。

5、Dialog w: 创建一个对话框对象,在该类中完成各种功能。

6、w.shw(): 当创建一个窗口部件的时候,默认它是不可见的,必须调用shw()函数使它变为可见。

7、return a.exec(): 程序进入消息循环,等待可能的输入进行相应,这里就是main()函数将控制权转交给QtQt完成事件处理工作,当应用程序退出的时候exec()函数的值就会返回。在exec()函数中,Qt接收并处理用户和系统的事件并且将它们传递给适当的窗口部件。

8、Q_OBJECT宏的作用是启动  Qt元对象系统 的一些特性(如支持信号和槽等),它必须放置到类定义的私有区。

9、QgridLayout *mainLayout =

new QgridLayout(this) 用于网格布局管理器,将所有的控件的位置固定。头文件为:#include

二、信号与槽机制(Signal&Slot)

1、Qt提供了信号和槽机制用于完成界面操作的响应,是完成任意两个Qt对象之间的通信机制。

2、信号与槽机制的连接方式

      (1)一个信号可以与另一个信号相连:

      connect(Object1,  SIGNAL(signal1),  Object2, SIGNAL(signal1));

      表示Object1的信号1发射可以触发Object2的信号1发射。

      (2)同一个信号可以与多个槽相连:

      connect(Object1,  SIGNAL(signal2),  Object2, SIGNAL(slot2));

       connect(Object1,  SIGNAL(signal2),  Object3, SIGNAL(slot1));

      (3)同一个槽可以相应多个信号:

      connect(Object1,  SIGNAL(signal2),  Object2, SIGNAL(slot2));

       connect(Object3,  SIGNAL(signal2),  Object2, SIGNAL(slot2));

      (4)最常用的连接方式为:

      connect(Object1,  SIGNAL(signal),  Object2, SIGNAL(slot));

      其中,signal为对象Object1的信号,slot为对象Object2的槽。

3、SIGNAL()SLOT()Qt定义的两个宏,它们返回参数是C语言风格的字符串(const char*)。因此下面两个信号与槽连接是等同的。

       connect(button,  SIGNAL(clicked()),  this,  SLOT(showArea()));

      connect(button,  “clicked()”, this,  “showArea()”);

4、信号与槽机制的优点

      (1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数同接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数,(应该和默认参数有关)。如果信号和槽的签名不符,编译器会报错。

      (2)松散耦合

5、信号与槽机制的流程

      (1)需要定位接收信号的对象

      (2)安全地遍历所有的关联(如一个信号关联多个槽情况)

      (2)编组(marshal)/解组(unmarshal)传递的参数

      (3)多线程的时候,信号可能需要排队等待

6、Qt元对象系统

        (1)基类QObject:任何需要使用元对象系统功能的类必须继承自QObject

        (2)Q_OBJECT宏:Q_OBJECT宏必须出现在类的私有声明区,由于启动元对象的特性。

        (3)元对象编译器(Meta-Object Compiler, moc):为QObject子类实现元对象特性提供必要的代码实现。

三、字符串类

1、QString提供了一个二元的“+”操作符由于组合两个字符串,直接连接到一起。

2、QString::append()函数具有与“+=”操作费同样的功能,实现在一个字符串的末尾追加另一个字符串。例如:

      QString str1 = “Welcome”;

       QString str2 = “to”;

       str1.append(str2);

       str1.append(“you!  ”);

       结果为:“str1 = Welcome to you!  “

3、组合字符串的另一个函数是 QString::sprintf(),此函数支持的格式定义符和C++库中的函数sprintf()定义的一样。例如:

      QString str;

       str.sprintf(“%s”, “ Welcome  ”);  //str= “Welcome”;

       str.sprintf(“%s”, “ to you!  ”); //str= “to you! ”;

       str.sprintf(“%s %s”, “ Welcome  ”, “to you! ”); //str = “Welcome to you! ”;

4、Qt还提供了QString::arg()函数,此函数的重载可以处理很多的数据类型。它是类型安全,完全支持Unicode,并允许改变”%n”参数的顺序。例如:

      QString str;

       str = QString(“%1 was born in %2.”).arg(“Join”).arg(1982);

       //str = “Join was born in 1982.”;

      其中:“%1”被替换为”Join”, “%2”被替换为”1982”

5、insert()函数:在原字符串特定的位置插入另一个字符串。

6、prepend()函数:在原字符串的开头插入另一个字符串。

7、replace()函数:用指定的字符代替原字符串中的某些字符。

8、QString::trimmed()函数:移除字符串两端的空白字符。

9、QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符代替字符串中出现的空白字符。

10、QString::startsWith()判断一个字符串是否以某个字符串开头,第二个参数表示是否大小写敏感。例如:

      QString str = “Welcome to you! ”;

       str.startsWith(“Welcome”,Qt::CaseSensitive); //返回true

11、QString::endsWith()判断一个字符串是否以某个字符串结尾。

12、QString::contains()判断一个指定的字符串是否出现过。

13、比较字符串compare(const

QString&, const QString&, Qt::CaseSensitivity):该函数可以指定是否进行大小写比较,而大小写比较是完全基于字符的Unicode编码值的,速度非常快。

14、QString::toInt()函数将字符串转换为整数类型,类似的还有toDouble(),toFloat(),toLong(),toLongLong()等。例如:

      QString str = “125”;

       bool ok;

       int hex = str.toInt(&ok, 16); //十六进制  ok = true, hex =293

       int dec = str.toInt(&ok, 10); //十进制  ok = true, dec =125

15、注意:一个NULL字符串一定是一个空字符串,而一个空字符串未必是一个NULL字符串。例如:

      QString().isNull(); //结果为true

       QString().isEmpty(); //结果为true

       QString(“”).isNull(); //结果为false

       QString(“”).isEmpty(); //结果为true

你可能感兴趣的:(2022-01-21)