Efter tio år av äktenskap lämnade hon mig för en annan. Ett år senare stod hon på min tröskel, gravid och förkrossad…
Jag träffade min fru, Elin, för nästan tolv år sedan. Då studerade jag fortfarande på ingenjörshögskolan i Göteborg och bodde i studentkorridor. Elin hade precis kommit från en liten by i Dalarna, vilse, ensam, en främling i denna bullriga stad. Vi blev inte nära direkt. Jag hade knappt lagt märke till henne först, hon var för tyst. Hon satt i sitt hörn med sina böcker, pratade knappt.
Men tiden gjorde sitt. Efter några månader började vi prata, först försiktigt, sedan varje kväll utan att kunna sluta. Hon delade sina tvivel, jag mina framtidsdrömmar. Snart fick vi ett parrumkorridorsansvarig litade på oss, såg att vi var seriösa. Så började vårt liv tillsammans.
Jag visste alltid vad jag ville. Vara en stark man, en bärande kraft, inte bara bygga väggar utan fylla dem med en hems värme. Jag sa det rakt ut: “Du ska inte behöva jobba. En kvinna ska ta hand om hemmet och barnen. Och om en man inte kan försörja sin familj, är han ingen man.” Hon protesterade inte. Hon lagade mat, städade, väntade på mig om kvällarna. Vi var en riktig familj.
Med åren klättrade jag i karriären. Jag började på ett byggföretag, arbetade mig upp till arbetsledare, sen startade jag eget. Vi köpte ett hus i förorten, två bilaren till mig, en till henne. Vi levde som vi drö# 2. 信号与槽
## 2.1 信号与槽机制简介
### 1. 信号与槽机制简介
信号与槽是 Qt 中的核心机制,也是 Qt 区别于其他开发框架的最大特色简单来说,信号和槽用于两个对象之间的通信
* 一个信号(signal)就是一个能够被观察的事件,或者至少是事件已经发生的一种通知
* 当信号发出时,槽(slot)被调用,对信号进行响应
### 2. 信号与槽的关系
* 一个信号可以关联到多个槽上
* 多个信号也可以关联到同一个槽上
* 甚至,一个信号还可以关联到另一个信号上
### 3. 信号与槽的语法
信号和槽的关联是通过 `connect()` 静态方法完成的,其基本语法是:
“`C++
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
“`
其中:
* `sender` 和 `receiver` 都是 QObject 对象指针
* `SIGNAL()` 和 `SLOT()` 是特殊的宏,它们将其参数转换成相应的字符串
### 4. 信号与槽的关联关系
信号和槽之间的关联关系可以是一对一一对多或多对一有如下几种形式:
* 一个信号可以连接多个槽
* 多个信号可以连接同一个槽
* 一个信号可以连接另一个信号
* 信号和槽之间可以断开连接
### 5. 信号与槽的参数
信号和槽的参数应该一致当信号和槽的参数个数不一致时,只有前面的参数会被传递,后面多出的参数被忽略
### 6. 信号与槽的调用顺序
当信号和槽是一对多的关系时,槽函数的调用顺序是随机的
### 7. 信号与槽的返回值
信号和槽都可以带参数,但信号不能有返回值,而槽可以有返回值
### 8. 信号与槽的线程安全
信号和槽的机制是线程安全的当一个信号发出时,Qt 会确保所有关联的槽函数都会被调用,即使在多线程环境下也是如此
## 2.2 信号与槽机制的使用
### 1. 信号与槽机制的使用
信号和槽机制的使用步骤如下:
1. 定义一个类,继承自 QObject 类
2. 在类中声明信号和槽
3. 在类中实现槽
4. 在类中定义信号
5. 使用 connect() 函数连接信号和槽
### 2. 信号与槽机制的使用示例
#### 2.1 示例1:信号与槽的基本使用
“`C++
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button(“Quit”);
button.show();
QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
return app.exec();
}
“`
#### 2.2 示例2:信号与槽的参数传递
“`C++
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button(“Click me”);
button.show();
QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
return app.exec();
}
“`
#### 2.3 示例3:信号与槽的断开连接
“`C++
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button(“Click me”);
button.show();
QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
QObject::disconnect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
return app.exec();
}
“`
#### 2.4 示例4:信号与槽的一对多
“`C++
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button(“Click me”);
button.show();
QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(aboutQt()));
return app.exec();
}
“`
#### 2.5 示例5:信号与槽的多对一
“`C++
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button1(“Click me”);
QPushButton button2(“Click me too”);
button1.show();
button2.show();
QObject::connect(&button1, SIGNAL(clicked()), &app, SLOT(quit()));
QObject::connect(&button2, SIGNAL(clicked()), &app, SLOT(quit()));
return app.exec();
}
“`
#### 2.6 示例6:信号与槽的信号连接信号
“`C++
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button1(“Click me”);
QPushButton button2(“Click me too”);
button1.show();
button2.show();
QObject::connect(&button1, SIGNAL(clicked()), &button2, SIGNAL(clicked()));
QObject::connect(&button2, SIGNAL(clicked()), &app, SLOT(quit()));
return app.exec();
}
“`
#### 2.7 示例7:信号与槽的槽函数带参数
“`C++
#include
#include
#include
void mySlot(bool checked)
{
qDebug() << "Button is checked:" << checked;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Click me");
button.setCheckable(true);
button.show();
QObject::connect(&button, SIGNAL(clicked(bool)), mySlot);
return app.exec();
}
```
#### 2.8 示例8:信号与槽的信号带参数
```C++
#include
#include
#include
void mySlot(bool checked)
{
qDebug() << "Button is checked:" << checked;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Click me");
button.setCheckable(true);
button.show();
QObject::connect(&button, SIGNAL(clicked(bool)), mySlot);
return app.exec();
}
```
## 2.3 自定义信号与槽
### 1. 自定义信号与槽
信号和槽的机制不仅仅局限于 Qt 的内置类和函数,我们也可以自定义信号和槽
### 2. 自定义信号与槽的步骤
1. 定义一个类,继承自 QObject 类
2









