新邵县住房和城乡建设局网站,销售平台都有哪些,广州做啊里巴巴网站多少钱,公司网站主页怎么做前言
在图形界面编程中QT是为首选#xff0c;组件之间如何实现通信是核心的技术内容。Qt 使用了信号与槽的机制#xff0c;非常的高效、简单、易学#xff0c;方便开发者的使用。本文详细的介绍了Qt 当中信号与槽的概念#xff0c;并演示了各种信号与槽的连接方式。
什么…前言
在图形界面编程中QT是为首选组件之间如何实现通信是核心的技术内容。Qt 使用了信号与槽的机制非常的高效、简单、易学方便开发者的使用。本文详细的介绍了Qt 当中信号与槽的概念并演示了各种信号与槽的连接方式。
什么是信号和槽Signal and Slot
信号和槽是用于对象之间的通信它是Qt的核心机制在Qt编程中有着广泛的应用。如果想学好Qt一定要充分掌握信号的槽的概念与使用。 举个例子在一个十字路口信号灯变成了绿色对面的汽车看到后就启动了。信号灯就是发送信号的对象绿灯亮是它发送的信号 (signal)汽车是接收对象汽车行驶是汽车对信号的响应也叫槽 (slot)。 再举一个例子比如在一个主窗口内有一个关闭按钮如果点击这个按钮窗口就会关闭那么关闭按钮是发送信号的对象它发送的信号是点击接收信号的对象是窗口响应信号的槽是关闭窗口。
信号和槽的代码实例
在Qt中发送对象、发送的信号、接收对象、槽可以通过很多种方式连接。我们下面通过一些例子逐一做演示。
1Qt 4 使用宏
在Qt 4的版本中主要通过connect 宏的方式进行通信连接。
connect(发送对象信号接收对象槽函数)其中发送信号和槽函数需要用 SIGNAL() 和 SLOT() 来进行声明。
connect 函数声明如下 [static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type Qt::AutoConnection) 比如点击按钮关闭窗口的例子代码可以这样写
connect(ui-pushButton, SIGNAL(clicked()), this, SLOT(close()));如果想自定义槽函数需要先将槽函数的声明添加到类的slots中。比如我们对一个QLineEdit控件添加一个接收textEdited信号的槽函数onTextEdited .h
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();private slots:void onTextEdited(QString);private:Ui::MainWindow *ui;
};然后实现函数并用connect与信号连接
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton, SIGNAL(clicked()), this, SLOT(close())); connect(ui-lineEdit, SIGNAL(textEdited(QString)), this, SLOT(onTextEdited(QString)));
}void MainWindow::onTextEdited(QString s)
{qDebug() s;
}这样写的好处是信号和槽参数很直观但缺点是因为使用宏编译时不做类型检查如果有问题的话在运行的时候才会发现。
使用Qt Creator 界面添加信号的槽函数
另外一种方式不需要使用 connect 函数可以通过Qt Creator 界面来完成发送信号和槽函数的连接比如我们右键点击一个按钮然后选择“转到槽” 选择信号我们点击QAbstractButton的clicked()信号表示按钮被点击 接下来Qt Creator会自动为我们生成如下代码首先是槽函数的声明
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};然后是槽函数的实现
void MainWindow::on_pushButton_clicked()
{}使用这种方法我们不需要使用connect函数将信号与槽函数做连接。 这里槽函数的命名有一定的规则一般是 on_objectname_signal 这样来命名的。这种方法优点是减少了自己手动敲代码的工作量缺点是究竟有哪些信号与槽函数做了连接不易被发现没有connect 函数看起来直观。
使用Qt 5 新 connect 函数
Qt 5 推出了新的 connect 函数不需要使用 SIGNAL() 和 SLOT() 宏可以在编译时做类型检查 connect函数的声明如下 [static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type Qt::AutoConnection)
同样用代码实现点击按钮关闭窗口并且添加一个QLineEdit控件发送textEdited信号由onTextChanged()函数作为槽函数响应。
使用这种方法槽函数的声明不需要放到slots中只要像普通的函数一样声明就可以了类型需要与textEdit信号保持一致
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();void textChanged(QString);private:Ui::MainWindow *ui;
};使用 connect 将信号与槽函数连接不需要再使用 SIGNAL() 和 SLOT() 宏
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton, QPushButton::clicked, this, MainWindow::close);connect(ui-lineEdit, QLineEdit::textEdited, this, MainWindow::textChanged);
}void MainWindow::textChanged(QString s)
{qDebug() s;
}使用函数指针
在Qt 5版本的connect 函数里信号与槽函数的参数其实都是函数指针当信号或槽函数有重载时使用函数指针可以明确告诉编译器使用哪一个重载函数避免歧义。下面的例子虽然没有使用重载不过我们改成通过使用函数指针来向connect传递槽函数参数。
首先还是声明两个槽函数分别响应点击按钮信号和textEdited信号
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();void onButtonPushed();void onTextEdited(QString); private:Ui::MainWindow *ui;
};然后对函数做简单的实现
void MainWindow::onButtonPushed()
{this-close();
}void MainWindow::onTextEdited(QString s)
{qDebug() s;
}最后声明函数指针并且将它们与信号连接
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);void(MainWindow:: *buttonClickSlot)() MainWindow::onButtonPushed;void(MainWindow:: *textEditedSlot)(QString) MainWindow::onTextEdited;connect(ui-pushButton, QPushButton::clicked, this, buttonClickSlot);connect(ui-lineEdit, QLineEdit::textEdited, this, textEditedSlot);
}使用Lambda表达式
使用 Lambda表达式的好处是代码的书写更加方便快捷。在connect 函数中槽函数参数我们可以改用Lambda表达式的方式来进行传参。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton, QPushButton::clicked, this, [](){this-close();});connect(ui-lineEdit, QLineEdit::textEdited, this, [](QString s){qDebug() s;});
}使用Lambda表达式我们就不需要在类中对槽函数做任何的声明了。Lambda表达式是C 11的内容在比较低的 Qt版本中要注意在Pro项目文件中加入 CONFIG C 11。
总结
Qt 当中组件之间通过信号与槽的方式进行通信非常地高效对于开发者来说也很简单。使用 Qt 5版本的开发者建议使用上面后三种新的方式进行连接。补充一点信号和槽之间不是一一对应的关系。一个信号可以对应多个槽比如点击一个按钮可以触发多个不同的响应一个槽也可以响应多个不同的信号比如点击按钮可以关闭窗口点击左上角的小叉也可以关闭窗口。信号和槽之间只要通过connect 函数连接就建立了耦合关系如果想解除连接可以使用disconnect 函数。 文章转载自: http://www.morning.bmpjp.cn.gov.cn.bmpjp.cn http://www.morning.kztpn.cn.gov.cn.kztpn.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.qxnns.cn.gov.cn.qxnns.cn http://www.morning.rrrrsr.com.gov.cn.rrrrsr.com http://www.morning.bdypl.cn.gov.cn.bdypl.cn http://www.morning.wtnwf.cn.gov.cn.wtnwf.cn http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.phlrp.cn.gov.cn.phlrp.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.bbxbh.cn.gov.cn.bbxbh.cn http://www.morning.ygth.cn.gov.cn.ygth.cn http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn http://www.morning.fslrx.cn.gov.cn.fslrx.cn http://www.morning.nqbs.cn.gov.cn.nqbs.cn http://www.morning.gbcnz.cn.gov.cn.gbcnz.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.nfgbf.cn.gov.cn.nfgbf.cn http://www.morning.yrctp.cn.gov.cn.yrctp.cn http://www.morning.gpmrj.cn.gov.cn.gpmrj.cn http://www.morning.azxey.cn.gov.cn.azxey.cn http://www.morning.lmjkn.cn.gov.cn.lmjkn.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.nchsz.cn.gov.cn.nchsz.cn http://www.morning.kbdjn.cn.gov.cn.kbdjn.cn http://www.morning.rkzb.cn.gov.cn.rkzb.cn http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com http://www.morning.mxcgf.cn.gov.cn.mxcgf.cn http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn http://www.morning.rwls.cn.gov.cn.rwls.cn http://www.morning.jfzbk.cn.gov.cn.jfzbk.cn http://www.morning.yrhpg.cn.gov.cn.yrhpg.cn http://www.morning.pypqf.cn.gov.cn.pypqf.cn http://www.morning.qwbht.cn.gov.cn.qwbht.cn http://www.morning.slkqd.cn.gov.cn.slkqd.cn http://www.morning.bpmdh.cn.gov.cn.bpmdh.cn http://www.morning.pwdmz.cn.gov.cn.pwdmz.cn http://www.morning.czrcf.cn.gov.cn.czrcf.cn http://www.morning.rlwgn.cn.gov.cn.rlwgn.cn http://www.morning.ahscrl.com.gov.cn.ahscrl.com http://www.morning.gthgf.cn.gov.cn.gthgf.cn http://www.morning.tlrxt.cn.gov.cn.tlrxt.cn http://www.morning.ljdjn.cn.gov.cn.ljdjn.cn http://www.morning.rkqkb.cn.gov.cn.rkqkb.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.rqrxh.cn.gov.cn.rqrxh.cn http://www.morning.rxxdk.cn.gov.cn.rxxdk.cn http://www.morning.ryfqj.cn.gov.cn.ryfqj.cn http://www.morning.xphls.cn.gov.cn.xphls.cn http://www.morning.blqmn.cn.gov.cn.blqmn.cn http://www.morning.lmrcq.cn.gov.cn.lmrcq.cn http://www.morning.kzslk.cn.gov.cn.kzslk.cn http://www.morning.yrdkl.cn.gov.cn.yrdkl.cn http://www.morning.hwpcm.cn.gov.cn.hwpcm.cn http://www.morning.kpzrf.cn.gov.cn.kpzrf.cn http://www.morning.hzqjgas.com.gov.cn.hzqjgas.com http://www.morning.yhglt.cn.gov.cn.yhglt.cn http://www.morning.zdnrb.cn.gov.cn.zdnrb.cn http://www.morning.ghzfx.cn.gov.cn.ghzfx.cn http://www.morning.ptdzm.cn.gov.cn.ptdzm.cn http://www.morning.jxrpn.cn.gov.cn.jxrpn.cn http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.hrydl.cn.gov.cn.hrydl.cn http://www.morning.brhxd.cn.gov.cn.brhxd.cn http://www.morning.tfwsk.cn.gov.cn.tfwsk.cn http://www.morning.kjfsd.cn.gov.cn.kjfsd.cn http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn http://www.morning.fkmyq.cn.gov.cn.fkmyq.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.fhjnh.cn.gov.cn.fhjnh.cn http://www.morning.lgznc.cn.gov.cn.lgznc.cn http://www.morning.rksnk.cn.gov.cn.rksnk.cn http://www.morning.rfxyk.cn.gov.cn.rfxyk.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.bhxzx.cn.gov.cn.bhxzx.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.sbqrm.cn.gov.cn.sbqrm.cn http://www.morning.qxmnf.cn.gov.cn.qxmnf.cn