信息推广网站点不开的那种怎么做,网站建设与网页设计制作,重庆营销策划公司排名,福永外贸网站建设文章目录 一、信号与槽机制1、基本概念2、信号与槽函数连接2.1、connect宏实现信号与槽连接2.2、Qt5新connect函数2.3、使用函数指针2.4、使用lambda表达式2.5、使用Qt Creator添加信号的槽函数 3、结论 前言#xff1a; Qt信号与槽机制是一种用于处理对象间通信的强大机制宏实现信号与槽连接2.2、Qt5新connect函数2.3、使用函数指针2.4、使用lambda表达式2.5、使用Qt Creator添加信号的槽函数 3、结论 前言 Qt信号与槽机制是一种用于处理对象间通信的强大机制它是Qt框架的核心特性之一。信号与槽机制使得Qt对象可以在不了解彼此的情况下进行通信这种松耦合的设计思想极大地提高了代码的可重用性和灵活性。 一、信号与槽机制
1、基本概念 在Qt中一个对象可以发出一个信号而另一个对象的槽函数可以接收这个信号并作出响应。信号是一个类的成员函数当某个特定的事件发生时它会被自动调用。槽函数也是类的成员函数它可以被信号连接当信号发出时槽函数会被自动执行。下面是与信号槽机制相关的基本概念如下 1信号 在Qt中信号是一个特定的成员函数用于在某个特定事件发生时被发射emit。信号本身并不实现任何功能它只是表明某个事件已经发生。信号可以被定义为一个类的成员函数但其实现是由Qt的元对象系统自动完成的。信号的声明通常在类的头文件中进行使用signals关键字来标记。 2槽 槽是普通的成员函数可以被信号触发。当信号被发射时与之连接的槽函数将被调用。槽函数可以实现具体的功能比如更新界面、处理数据等。槽函数的声明和普通成员函数一样但在Qt的元对象系统中需要进行一些特殊的标记以便与信号进行连接。 2、信号与槽函数连接 信号与槽的连接是通过QObject::connect()函数实现的需要注意的是为了使类支持信号与槽机制需要在类的声明中包含Q_OBJECT宏。下面介绍几种不同的连接方式如下 2.1、connect宏实现信号与槽连接 在Qt4及之前的版本基于connect宏实现信号与槽绑定其中发送信号和槽函数需要用 SIGNAL() 和 SLOT() 来进行声明connect函数声明如下 QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type Qt::AutoConnection)下面是一段示例代码如下 #include mainwindow.h
#include ui_mainwindow.h
#include QDebugMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);// 登录按键绑定槽函数connect(this-ui-btn_ok, SIGNAL(clicked(bool)), this, SLOT(login()));}void MainWindow::login()
{QString username ui-lineEdit_username-text();QString password ui-lineEdit_password-text();if (username jack password 12345) {qDebug() login success;} else {qDebug() login fail;}
} 基于connect宏实现信号与槽连接需要注意下面这些问题 声明槽函数要使用private slots或public slots关键字信号和槽参数不能包含任何变量名只能包含类型
2.2、Qt5新connect函数 Qt5推出了新的connect函数不需要使用SIGNAL()和SLOT()宏可以在编译时做类型检查connect函数声明如下 QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type Qt::AutoConnection)使用这种方法槽函数的声明不需要放到slots中只要像普通的函数一样声明就可以了类型需要与信号保持一致下面给登录按键绑定槽函数如下 class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();// 声明槽函数与普通的成员函数一样void login();private:Ui::MainWindow *ui;
}; 绑定槽函数 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);// 登录按键绑定槽函数connect(ui-btn_ok, QPushButton::clicked, this, MainWindow::login);
}void MainWindow::login()
{qDebug() login;
}
2.3、使用函数指针 在Qt 5版本的connect 函数里信号与槽函数的参数其实都是函数指针当信号或槽函数有重载时使用函数指针可以明确告诉编译器使用哪一个重载函数避免歧义 public:MainWindow(QWidget *parent nullptr);~MainWindow();// 声明两个同名的login函数void login();void login(int state);通过函数指针绑定槽函数 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);// 定义函数指针注意声明指向成员函数的指针时要增加类作用域void (MainWindow::*pfnLoginSlot)() MainWindow::login;// 登录按键绑定无参槽函数connect(ui-btn_ok, QPushButton::clicked, this, pfnLoginSlot);
}void MainWindow::login()
{qDebug() login;
}void MainWindow::login(int state)
{qDebug() login state;
}
2.4、使用lambda表达式 在connect函数中槽函数参数可以改用Lambda表达式的方式来进行传参。使用 Lambda表达式的好处是代码的书写更加方便快捷同时不需要在类中对槽函数做任何的声明了 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);// 使用Lamdbda表达式作为槽函数connect(ui-btn_ok, QPushButton::clicked, this, [](){qDebug() login;});
}
2.5、使用Qt Creator添加信号的槽函数 通过Qt Creator 界面来完成发送信号和槽函数的连接比如右键点击一个按钮然后选择“转到槽” Qt Creator会自动生成如下代码首先是槽函数的声明 // 槽函数声明
private slots:void on_btn_cancel_clicked(bool checked);槽函数实现如下 #include mainwindow.h
#include ui_mainwindow.h
#include QDebugMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btn_cancel_clicked(bool checked)
{}使用这种方法不需要使用connect函数将信号与槽函数做连接。 这里槽函数的命名有一定的规则一般是 on_objectname_signal 这样来命名的。这种方法优点是减少了手动敲代码的工作量缺点是究竟有哪些信号与槽函数做了连接不易被发现没有connect 函数看起来直观。 3、结论 Qt的信号与槽机制提供了一种强大且灵活的方式来处理对象间的通信它是Qt框架中不可或缺的一部分。通过信号和槽开发者可以轻松地构建出响应式、事件驱动的用户界面和应用程序逻辑。