QT connnect 函数的简单应用——不同界面的实时通信过程
Connect函数介绍
如果说Qt实现的最巧妙的应用,那就说Connect函数(信号和槽机制)。
在Qt Assistant中Connect函数的形式为:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
显然可以看到connect继承自QObject类。其中,包含四个指定参数
- sender,发送方对象指针
- signal,信号函数
- receiver,接收方对象指针
- method,槽函数(处理函数)
其中信号和槽就是整个Qt的核心,Qt使用信号和槽来进行对象间的通信。当一个特殊的事件发生时便可以发射一个信号,而槽就是一个函数,他在信号发射后被调来响应这个信号
除了上述官方的形式,connect函数调用亦可实现如下的形式
QObject::connect(Object1,SIGNAL(signal1),Object2,SLOT(slot1));
//也可用lambda表达式实现
QObject::connect(Object1,SIGNAL(signal1),[=](){]);
当然信号和槽机制存在着优点和缺点:
优点:
- 类型安全。信号的参数类型和参数个数同接收该信号的槽的参数类型和参数个数是相同的,即需要关联的信号和槽的签名必须是等同的
- 松散耦合:信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无须知道是那个对象的那个槽需要接收它发送的信号,它只需做的就是在适当的事件发送适当的信号就可以了,而不需要知道也不关心它的信号有没有被接收到,更不需要知道那个对象的那个槽接收到了信号。同样的对象的槽函数也无需知道什么信号关联了自己。
缺点:
信号和槽机制增强了对象间通信的灵活性,然而同时伴随着一些性能的损失。同回调函数相比,信号和槽机制运行效率就相较而言有些慢。
用connect函数实现不同页面的通信
在实现例程之前,需明确emit,emit是Qt中的关键字,用以标记发送信号。
静态页面设计
新建两个ui界面,一个是主界面,一个是子界面
主界面
子界面
代码编写
主界面的代码
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setpara=new para();
//connect 函数实现 子界面和主界面的实时显示
connect(setpara,¶::sendPara,this,&Widget::receivePara);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButtonOpenPara_clicked()
{
setpara->show();
}
void Widget::receivePara(QStringList str)
{
ui->paraLabel0->setText(str.at(0));
ui->paraLabel1->setText(str.at(1));
ui->paraLabel2->setText(str.at(2));
ui->paraLabel3->setText(str.at(3));
ui->paraLabel4->setText(str.at(4));
ui->paraLabel5->setText(str.at(5));
ui->paraLabel6->setText(str.at(6));
ui->paraLabel7->setText(str.at(7));
ui->paraLabel8->setText(str.at(8));
ui->paraLabel9->setText(str.at(9));
ui->paraLabel10->setText(str.at(10));
ui->paraLabel11->setText(str.at(11));
ui->paraLabel12->setText(str.at(12));
ui->paraLabel13->setText(str.at(13));
qDebug()<<"参数设置成功";
}
子界面主要代码
#include "para.h"
#include "ui_para.h"
para::para(QWidget *parent) :
QWidget(parent),
ui(new Ui::para)
{
ui->setupUi(this);
readCurrentPara();
}
para::~para()
{
delete ui;
}
void para::readCurrentPara()
{
beamModel=ui->paraCB1->currentText();
singleWidth=ui->paraCB2->currentText();
measureRange=ui->paraCB3->currentText();
workFrequence=ui->paraCB4->currentText();
rollCompensation=ui->paraCB5->currentText();
initalGain=ui->paraSB6->text();
HHMIN=ui->paraSB7->text();
coverSector=ui->paraCB8->currentText();
transmitPower=ui->paraCB9->currentText();
TVGcurve=ui->paraCB10->currentText();
uploadWavefrom=ui->paraCB11->currentText();
automaticMode=ui->paraCB12->currentText();
installationOffset=ui->paraSB13->text();
HHMAX=ui->paraSB14->text();
paraStr<<beamModel<<singleWidth<<measureRange<<workFrequence<<rollCompensation
<<initalGain<<HHMIN<<coverSector<<transmitPower<<TVGcurve
<<uploadWavefrom<<automaticMode<<installationOffset<<HHMAX;
}
void para::on_btnConfirm_clicked()
{
this->close();
}
void para::on_btnCancel_clicked()
{
ui->paraCB1->setCurrentText(paraStr.at(0));
ui->paraCB2->setCurrentText(paraStr.at(1));
ui->paraCB3->setCurrentText(paraStr.at(2));
ui->paraCB4->setCurrentText(paraStr.at(3));
ui->paraCB5->setCurrentText(paraStr.at(4));
ui->paraSB6->setValue(paraStr.at(5).toFloat());
ui->paraSB7->setValue(paraStr.at(6).toFloat());
ui->paraCB8->setCurrentText(paraStr.at(7));
ui->paraCB9->setCurrentText(paraStr.at(8));
ui->paraCB10->setCurrentText(paraStr.at(9));
ui->paraCB11->setCurrentText(paraStr.at(10));
ui->paraCB12->setCurrentText(paraStr.at(11));
ui->paraSB13->setValue(paraStr.at(12).toFloat());
ui->paraSB14->setValue(paraStr.at(13).toFloat());
}
void para::on_btnApply_clicked()
{
//首先将Stringlist置为空
paraStr.clear();
// qDebug()<<paraStr<<"为空";'
readCurrentPara();
QMessageBox::information(this,"设置成功","参数设置成功");
emit sendPara(paraStr);
}