写在开头:
我们可以去这个网站进行学习C++的相关知识:https://github.com/0voice
目录
信号与槽机制连接方式
-
一个信号可以跟另一个信号相连:
connect(object1, SIGNAL(signal1), object2, SIGNAL(signal1));
作用: 这里
object1
发出signal1
信号时,会自动触发object2
的signal2
信号。用途: 这种方式常用于信号链路,即当一个信号发出后,进一步发出另一个信号。这种模式可以用于多级事件处理或通知多个对象某一事件的发生。
-
同一个信号跟多个槽相连
connect(object1, SIGNAL(signal2), object2, SIGNAL(slot2));
connect(object1, SIGNAL(signal2), object3, SIGNAL(slot1));
作用: object1
发出 signal2
信号时,会同时调用 object2
的 slot2()
函数和 object3
的 slot3()
函数。
用途: 这种模式非常适合需要多个对象对同一事件做出反应的场景。例如,当用户点击一个按钮时,多个操作(如保存数据、更新UI等)需要同时执行。
常用链接方案通常采用:
connect(object1, SIGNAL(signal), object2, SLOT(slot));
案例:计算球体的体积:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
// 引用标签、命令按钮对应头文件
#include <QDialog>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLabel *lab1, *lab2; // 创建两个标签,lab1用来作为提示语,lab2用来显示计算结果
QLineEdit *lEdit; // lEdit用来输入文本
QPushButton *pbt; // 这个是按钮
Ui::Dialog *ui;
private slots:
void CalcBallVolume(); // 槽函数计算圆球的体积
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
const static double PI = 3.1415;
#include <QGridLayout> // 用于表格布局
Dialog::Dialog(QWidget *parent) // Dialog的有参构造函数
: QDialog(parent)
, ui(new Ui::Dialog)
{
// 创建一个标签(提示用户输入圆球的半径)
lab1 = new QLabel(this);
lab1->setText(tr("请输入圆球的半径"));
ui->setupUi(this);
// 创建第二个标签(专门用来显示计算圆球的体积)
lab2 = new QLabel(this);
// 创建一个编辑框控件(专门用于接受用户的输入圆球半径的值)
lEdit = new QLineEdit(this);
// 创建命令按钮
pbt = new QPushButton(this);
pbt->setText(tr("计算圆球体积"));
// 表格布局
QGridLayout *mLay = new QGridLayout(this);
mLay->addWidget(lab1, 0, 0); // 把第一个标签放在左上角
mLay->addWidget(lEdit, 0, 1); // 把输入文本的操作放在右上角
mLay->addWidget(lab2, 1, 0); // 把结果放在左下角
mLay->addWidget(pbt, 1, 1); // 计算球的体积的按钮放在右下角
// 让信号和槽函数进行关联
connect(lEdit, SIGNAL(textChanged(QString)), this, SLOT(CalcBallVolume()));
}
Dialog::~Dialog()
{
delete ui;
}
// 计算球体体积的函数
void Dialog::CalcBallVolume(){
bool isLoop;
QString tempStr;
QString valueStr=lEdit->text();
int valueInt = valueStr.toInt(&isLoop);
double dVSum = 4.0/3.0 * PI * valueInt * valueInt * valueInt;
lab2->setText(tempStr.setNum(dVSum));
}
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.setWindowTitle("计算圆球的体积:"); // 设置题目
w.show(); // 显示对话框
return a.exec();
}
注意:这个是程序员一输入数字就会马上显示,不用点击按钮,如果我们需要点击按钮的话,可以把dialog.cpp改成这样:
#include "dialog.h"
#include "ui_dialog.h"
const static double PI = 3.1415;
#include <QGridLayout> // 用于表格布局
Dialog::Dialog(QWidget *parent) // Dialog的有参构造函数
: QDialog(parent)
, ui(new Ui::Dialog)
{
// 创建一个标签(提示用户输入圆球的半径)
lab1 = new QLabel(this);
lab1->setText(tr("请输入圆球的半径"));
ui->setupUi(this);
// 创建第二个标签(专门用来显示计算圆球的体积)
lab2 = new QLabel(this);
// 创建一个编辑框控件(专门用于接受用户的输入圆球半径的值)
lEdit = new QLineEdit(this);
// 创建命令按钮
pbt = new QPushButton(this);
pbt->setText(tr("计算圆球体积"));
// 表格布局
QGridLayout *mLay = new QGridLayout(this);
mLay->addWidget(lab1, 0, 0); // 把第一个标签放在左上角
mLay->addWidget(lEdit, 0, 1); // 把输入文本的操作放在右上角
mLay->addWidget(lab2, 1, 0); // 把结果放在左下角
mLay->addWidget(pbt, 1, 1); // 计算球的体积的按钮放在右下角
// 让信号和槽函数进行关联
connect(pbt, &QPushButton::clicked, this, &Dialog::CalcBallVolume);
}
Dialog::~Dialog()
{
delete ui;
}
// 计算球体体积的函数
void Dialog::CalcBallVolume(){
bool isLoop;
QString tempStr;
QString valueStr=lEdit->text();
int valueInt = valueStr.toInt(&isLoop);
if(isLoop){
double dVSum = 4.0/3.0 * PI * valueInt * valueInt * valueInt; // 计算球体的体积
lab2->setText(tempStr.setNum(dVSum)); // 然后将结果放在标签上去
}else{
// 如果不行的话,显示输入无效
lab2->setText(tr("请输入有效数字"));
}
}
总结:
一个信号可以跟多少信号进行连接,也可以只跟一个信号进行连接
常用链接方案通常采用:
connect(object1, SIGNAL(signal), object2, SLOT(slot));
标签:QT,信号,圆球,Dialog,new,机制,include,mLay
From: https://blog.csdn.net/m0_74655006/article/details/142426118