哈尔滨网站设计公司/个人网页在线制作
一、信号与槽概念
信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。
槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
二、信号与槽关联
信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是: QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串
如:关闭窗口的信号与槽的关联:
QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close()));
三种实现事件的方式:
1.手动创建信号和槽:
a.在 UI 设计器里,单击上方工具栏里的“Edit Widgets”按钮:
b.在 UI 设计器里,单击上方工具栏里的“Edit Signals/Slots”按钮,窗体进入信号与槽函数编辑状态。将鼠标移动到某个按钮上方,再按下鼠标左键,移动到窗体的空白区域释放左键。
使用该方法构建项目后,在ui_xxx.h中的setupUi函数中,有以下代码,会自动关联信号与槽。
QObject::connect(pushButton_Sure, SIGNAL(clicked()), Dialog, SLOT(accept()));QObject::connect(pushButton_Cancel, SIGNAL(clicked()), Dialog, SLOT(reject()));QObject::connect(pushButton_Close, SIGNAL(clicked()), Dialog, SLOT(close()));
2.在Edit Widgets界面,右键点击某个按钮->转到槽,选择信号并双击,添加代码。如:实现文字倾斜功能:
void Dialog::on_checkBox_Underline_clicked(bool checked)
{QFont font=ui->textEdit->font();font.setUnderline(checked);ui->textEdit->setFont(font);
}
使用该方法构建项目后,在ui_xxx.h中的setupUi函数中,有以下代码:
QMetaObject::connectSlotsByName(Dialog);
connectSlotsByName(Dialog); 函数将搜索 Dialog界面上的所有组件,将信号与槽函数匹配的信号和槽关联起来。如void Dialog::on_checkBox_Underline_clicked(bool checked)函数正好是checkBox_Underline的clicked的槽函数,如同执行了下面的这样一条语句:
QObject::connect(pushButton, SIGNAL(clicked(bool)), this, SLOT(on_checkBox_Underline_clicked(bool)));
3.全代码,手动编写.h文件和.cpp文件,如实现文字颜色变化功能:
.h文件中,private slots下添加函数声明:void setTextFontColor();
.cpp中,实现该函数:
void Dialog::setTextFontColor()
{QPalette plet=ui->textEdit->palette();if (ui->radioButton_Blue->isChecked())plet.setColor(QPalette::Text,Qt::blue);else if (ui->radioButton_Red->isChecked())plet.setColor(QPalette::Text,Qt::red);else if (ui->radioButton_Black->isChecked())plet.setColor(QPalette::Text,Qt::black);elseplet.setColor(QPalette::Text,Qt::black);ui->textEdit->setPalette(plet);
}
.cpp中,还需要在 QWDialog 的构造函数中手工建立信号与槽的连接:
Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);connect(ui->radioButton_Blue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));connect(ui->radioButton_Red,SIGNAL(clicked()),this,SLOT(setTextFontColor()));connect(ui->radioButton_Black,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
}
关于信号与槽的使用,有以下一些规则需要注意:
1.一个信号可以连接多个槽,槽函数按照建立连接时的顺序依次执行;
2.多个信号可以连接同一个槽;
3.一个信号可以连接另外一个信号;
4.严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误;
5.在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。