盗取dede系统做的网站模板,wordpress中文留言板,小程序开发外包报价表,做设计学什么英语比较好的网站我们在使用Qt的时候#xff0c;不使用Qt Designer 的方式进行开发#xff0c;使用ui文件#xff0c;信号与槽的连接方式是生成代码之后才能在setupUi函数里才能看到#xff0c;或者需要进入Ui设计器里的信号槽模式里才能看到信号槽的连接。所以我们最好使用代码绘制界面。 …我们在使用Qt的时候不使用Qt Designer 的方式进行开发使用ui文件信号与槽的连接方式是生成代码之后才能在setupUi函数里才能看到或者需要进入Ui设计器里的信号槽模式里才能看到信号槽的连接。所以我们最好使用代码绘制界面。
一.Qt信号与槽机制
信号Signal就是在特定情况下被发射的事件槽Slot就是对信号响应的函数。槽函数与一般函数不一样的是槽函数可以与一个信号关联当信号被发射时关联的槽函数被自动执行。
信号与槽关联是用QObject::connect() 函数实现的其基本格式是
QObject::connect(sender,SIGNAL(signal()),recevier,SLOT(slot));connect()是QObject类的一个静态函数而QObject是所有Qt类的基类在实际调用时可以忽略前面的限定符所以可以直接写为
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));其中sender 是发射信号的对象的名称signal() 是信号名称。信号可以看做是特殊的函数需要带括号有参数时还需要指明参数。receiver 是接收信号的对象名称slot() 是槽函数 的名称需要带括号有参数时还需要指明参数。
当信号和槽函数带有参数时在 connect()函数里要写明参数的类型但可以不写参数名称。
一个信号可以连接另外一个信号说明了 connect 万物皆可连非常好用例如
connect(pushButton,SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChanged(QString)));这样当一个信号发射时也会发射另外一个信号实现某些特殊的功能。
严格的情况下信号与槽的参数个数和类型需要一致至少信号的参数不能少于槽的参数。 如果不匹配会出现编译错误或运行错误。
在使用信号与槽的类中必须在类的定义中加入宏 Q_OBJECT特别重要。
当一个信号被发射时与其关联的槽函数通常被立即执行就像正常调用一个函数一样。 只有当信号关联的所有槽函数执行完毕后才会执行发射信号处后面的代码。
总结如下图可以看到发送者与发送的信号是在一起的接收者与接收的信号/槽是在一起 的。它们不能在 connect()方法里写乱顺序由发送者发送出信号到接收者用信号/槽接收。 信号槽连接的方法已经讲解过了接下来讲解一下断开连接的方法使用disconnect()。
bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)信号与槽机制是 Qt GUI 编程的基础使用信号与槽机制可以比较容易地将信号与响应代码关联起来。
二. 如何在项目里创建信号
信号只需声明无需定义。所以我们只需要在 mianwindow.h 里声明信号即可。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QMainWindow
/*引入 QPushButton */
#include QPushButtonQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();signals:/* 声明一个信号只需声明无需定义 */void pushButtonTextChanged();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H三. 如何在项目中创建槽
创建槽的方法也很简单也是直接在 mianwindow.h 里直接声明槽在 mianwindow.cpp 里 实现槽的定义声明槽必须写槽的定义(定义指函数体的实现)否则编译器编译时将会报错。
槽有以下特点 槽可以是任何成员函数普通全局函数静态函数 槽函数和信号的参数和返回值要一致
根据上面的槽特点由于我们声明了信号 void pushButtonTextChanged(); 所以我们声明的槽函数必须是无返回值类型 void和无需参数。所以声明槽的代码如下。此外 我们还声明一个 QPushButton 对象 pushButton。对象 pushButton 可以写成简写 btn。这个根据个 人习惯即可简写的名称建议不要让人看不懂即可同时还声明一个按钮点击的槽。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QMainWindow
/*引入 QPushButton */
#include QPushButtonQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();signals:/* 声明一个信号只需声明无需定义 */void pushButtonTextChanged();public slots: /*声明一个槽函数*/void changeButtonText();/*声明按钮点击的槽函数*/void pushButtonClicked();
private:/* 声明一个对象 pushButton 也可以是btn易于读懂就行 */QPushButton *pushButton;
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H在 mainwindow.cpp 里实现 声 明 的 槽 函 数 void changeButtonText(); 和 void pushButtonClicked();。同时还实例化了 pushButton 对象。代码如下。
#include mainwindow.h
#include ui_mainwindow.hMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) //new一个UI中的MainWindow这里是一种初始化成员的方法
{//ui-setupUi(this);//这句话是进行界面初始化将this作为参数传到setupUi里ui界面//文件的对象会以this为父对象所有子对象将显示在MainWindow里我们要想使用ui里的对象//必须将代码写在ui-setUi(this)这句话之后因为ui-setupUi(this)会先初始化里面的对象只有初始化//里面的对象我们才能使用这个对象/* 设置窗体的宽为 800,高为 480 */this-resize(800,480);/* 实例化 pushButton 对象 */pushButton new QPushButton(this);/* 调用 setText()方法设定按钮的文本 */pushButton-setText(我是一个按钮);
}MainWindow::~MainWindow()
{delete ui;
}
/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{/* 使用 emit 发送信号 */emit pushButtonTextChanged();
}
/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{/* 在槽函数里改变按钮的文本 */pushButton-setText(被点击了);
}四. 如何在项目中连接信号与槽
信号槽连接的代码如下
connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
connect(this,SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));注意发送信号的对象和接收的信号的对象。因为我们 pushButtonClicked()是本类里定 义的槽所以用 this 来接收。同理pushButtonTextChanged()也是本类定义的信号。所以发送 者写成 this。changeButtonText()也是本类的槽函数所以接收槽的对象也是 this。
在 mainwindow.cpp 中信号槽连接的代码如下
#include mainwindow.h
#include ui_mainwindow.hMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) //new一个UI中的MainWindow这里是一种初始化成员的方法
{//ui-setupUi(this);//这句话是进行界面初始化将this作为参数传到setupUi里ui界面//文件的对象会以this为父对象所有子对象将显示在MainWindow里我们要想使用ui里的对象//必须将代码写在ui-setUi(this)这句话之后因为ui-setupUi(this)会先初始化里面的对象只有初始化//里面的对象我们才能使用这个对象/* 设置窗体的宽为 800,高为 480 */this-resize(800,480);/* 实例化 pushButton 对象 */pushButton new QPushButton(this);/* 调用 setText()方法设定按钮的文本 */pushButton-setText(我是一个按钮);/* 信号与槽连接 */connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButtonClicked()));connect(this, SIGNAL(pushButtonTextChanged()), this,SLOT(changeButtonText()));
}MainWindow::~MainWindow()
{delete ui;
}
/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{/* 使用 emit 发送信号 */emit pushButtonTextChanged();
}
/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{/* 在槽函数里改变按钮的文本 */pushButton-setText(被点击了);
}五. 学会使用 Qt 类的信号与槽
Qt里有大量的信号与槽都是Qt自定义好的那么我们该如何使用Qt信号与槽呢 进入 QPushButton 的定义处我们看到 QPushButton 不止 clicked 信号还有其他信号也 有 QPushButton 的槽函数返回上一步按 Alt 方向左键。在这里我们只是简单的看了如何在 已知信号和槽里查找其他信号与槽。实际上在开发中我们经常需要使用 Qt 帮助文档来查看 Qt 定义的信号与槽。我们将在下一章里讲解 Qt 帮助文档的使用帮助文档里面就有如何查看 Qt 的信号与槽等等。