前言
QT 中 信号 与 槽机制(Signal and Slot)是QT GUI 编程中的一项非常强大的功能。简单来说,它是一种事件处理机制,可以实现类与类之间的通信,并且可以解耦合应用程序。本文将对QT中信号与槽的详细使用方法做出介绍。
一、什么是信号与槽?
信号:(Signal)由操作系统产生的消息。指对象发生了某种事件,如点击按钮、文本框内容改变等。Qt中的控件和对象都定义了与之对应的信号。
槽:(slot) 程序中的消息处理函数。槽函数可以对信号事件做出响应,如更新界面、修改对象的属性等。
连接:(connect) 将系统消息绑定到消息处理函数,以使信号事件的发生可以触发槽函数的执行。
信号 到 槽 的连接必须发生在两个 QT 类对象之间。
2.QT 中的关键字:
①SIGNAL : 用于 指定 消息名。
② SLOT : 用于 指定 消息处理函数。
③ Q_OBJECT : 所有 自定义的槽类 必须在类声明的开始处加上 Q_OBJECT 。
④ slots : 用于在类中 声明消息处理函数。
二、QObject::connect 函数
在 Qt 中,我们通常使用 connect( ) 函数来建立信号与槽之间的连接.
当 sender 的 信号 发生时, signal 就会映射到 receiver 的 method成员函数上。
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ); 1 2
sender : 指定了信号的发送者
signal : 信号函数的指针, 消息名
receiver : 信号的接收者
method : 接收者的槽函数指针,接收对象的成员函数
ps :
在 QT 中,消息用字符串 进行描述。
connect 函数在消息名和处理函数之间 建立 映射。
示例代码:
class Widget : public QWidget { Q_OBJECT //声明(由于自定义槽函数) private: QPushButton FontDialogBtn; private slots: void FontDialogBtn_click(); // 消息处理函数 public: Widget(QWidget *parent = 0); ~Widget(); };
连接函数:
connect(&FontDialogBtn, SIGNAL(clicked()),this, SLOT(FontDialogBtn_click())); 1
三、QT 中的字符串类 QString
在 Qt 中,QString 是 Qt 提供的一个字符串处理类,它的成员函数覆盖了许多方面的字符串处理,包括文本处理、查找、替换、分割和格式化等。
1. 创建和初始化字符串:
/* 创建了两个具有相同值的QString变量。 */ QString str1 = "Hello World"; // 常量字符串 QString str2("Hello World"); // 构造函数
1
2
3
4
2. 字符串的拼接和添加
在Qt中,我们可以使用以下方法将两个字符串连接在一起:
QString str1 = "Hello"; QString str2 = "World"; QString result = str1 + " " + str2; 1
2
3
在上面的例子中,我们使用了+运算符以将两个字符串连接在一起,并将结果存储在新的QString中。
除此之外,我们还可以在字符串的末尾添加新的字符或子串。为此,QString提供了append( ) 、operator+=( ) 和 push_back( ) 成员函数。
3. 字符串的查找和替换
在Qt中,我们可以使用以下函数查找和替换字符串:
QString str = "This is a test string"; int index = str.indexOf("test"); // 查找test在字符串中第一次出现的位置 int lastIndex = str.lastIndexOf("test"); // 查找test在字符串中最后一次出现的位置 QString newStr = str.replace("test", "example"); // 将test替换为example 1
2
3
4
5
在上面的例子中,我们定义了一个字符串,然后使用indexOf()和lastIndexOf()函数查找test在字符串中第一次和最后一次出现的位置。最后,我们使用replace()函数将test替换为example。
4. 字符串的分割和处理
在Qt中,我们可以使用以下函数对字符串进行分割和处理:
QString str = "Name: John\nAge: 30"; QStringList list = str.split("\n"); // 按行分割,返回QStringList类型 QString name = list[0].split(": ")[1]; // 获取姓名 int age = list[1].split(": ")[1].toInt(); // 获取年龄并转换为int类型 1
2
3
4
5
在上面的例子中,我们使用了split()函数来将字符串按行分割,并返回QStringList类型。然后我们使用split()函数返回的结果就是一个QStringList类型的列表,我们可以通过索引将列表中的元素获取出来。接下来,我们可以使用split()函数进一步将每行按":"进行分割,并获取每个字段的值。
还可以使用其他的QString函数进行一些其他的字符串操作,如 trimmed( ) 函数可以去除字符串首尾的空格,toUpper()函数可以将字符串转为大写字母等。
总结
在本文中,我们简要介绍了Qt中信号与槽机制的基础知识及用法。
通过信号与槽机制的使用,我们可以使得代码变得更加清晰、易于维护,并且能够轻松地处理对象与对象之间的通信。
在使用过程中一定要注意对象的生命周期和连接关系,否则有可能会引起内存泄漏和程序崩溃等问题。
————————————————