干货2-信号与槽-2.信号与槽实战应用

121 阅读4分钟

1.需要做出来的应用软件

image.png

2.main.cpp

2.1 setWindowTitle()函数

修改应用程序的窗口标题名称

   //修改应用程序的窗口标题名称
    w.setWindowTitle("计算圆球的体积");

2.2完整main函数

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;

    //修改应用程序的窗口标题名称
    w.setWindowTitle("计算圆球的体积");

    w.show();
    return a.exec();
}

3.dialog.h

3.1引入标签,按钮,输入框

#include <qlabel.h>//标签控件
#include <qpushbutton.h>//按钮控件
#include <qlineedit.h>//文本输入框

3.1.1QLabel(标签控件)

主要用途:用于显示,不可编辑

特点:

只读,用户不能直接编辑
可以显示纯文本、富文本、图片
可以设置对齐方式、字体、颜色等

3.1.2QPushButton(按钮控件)

主要用途:用于触发动作,可点击

特点:

可点击,有按下、释放等状态
可以显示文本、图标
可以设置快捷键
可以连接信号和槽

3.1.3QLineEdit(单行文本输入框)

主要用途:用于输入,可编辑

特点:

可编辑,用户可以直接输入文本
可以设置输入限制(如只允许数字)
可以设置占位符文本
可以设置密码模式

3.2定义标签,按钮,输入框

private:
    QLabel *lab1,*lab2;// 显示圆球的半径和体积
    QLineEdit *lEdit;// 编辑按钮
    QPushButton *pbt;// 按钮控件

3.3定义槽函数计算圆球的体积

private slots:
    void CalcBallVolume();// 槽函数计算圆球的体积

3.4完整dialog.h代码

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

#include <qlabel.h>
#include <qpushbutton.h>
#include <qlineedit.h>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QLabel *lab1,*lab2;// 显示圆球的半径和体积
    QLineEdit *lEdit;// 编辑按钮
    QPushButton *pbt;// 命令按钮

private slots:
    void CalcBallVolume();// 槽函数计算圆球的体积
};

#endif // DIALOG_H

4.dialog.cpp

4.1实现槽函数框架

 void Dialog::CalcBallVolume(){
 }

4.2创建lab1标签(提示用户输入圆球的半径)

    lab1 = new QLabel(this);
    lab1->setText(tr("请输入圆球的半径:"));

4.3创建其他标签,按钮和输入框

    // 创建lab2标签
    lab2 = new QLabel(this);
    
    // 创建lEdit编辑框
    lEdit = new QLineEdit(this);
    
    // 创建pbt按钮
    pbt = new QPushButton(this);
    pbt->setText(tr("计算圆球体积"));

4.4利用表格布局,处理重叠

4.4.1引用头文件

//专门用于表格布局
#include <QGridLayout>

4.4.2表格布局

image.png

QGridLayout *mLay = new QGridLayout(this);
// 标签lab1第一行第一列
// 编辑框lEdit第一行第二列
// 标签lab2第二行第一列
// 按钮pbt第二行第二列

mLay->addWidget(lab1,0,0);
mLay->addWidget(lEdit,0,1);
mLay->addWidget(lab2,1,0);
mLay->addWidget(pbt,1,1);

4.5实现槽函数计算圆球的体积

  • isLoop是一个布尔变量,用于判断字符串转整数时是否成功。

  • tempStr 是一个临时字符串变量,用于存放体积的字符串表示。

  • valueStr 是获取界面上 lEdit(一个 QLineEdit 输入框)里的文本内容。

  • valueInt是把输入框里的文本 valueStr 转换为整数 valueInt,如果转换成功,isLoop 会被设为 true。

  • dvSum是用球体体积公式V=43πr3V = \frac{4}{3} \pi r^3计算体积,valueInt 作为半径 r,PI 应该是圆周率常量。

  • 最后把计算出来的体积 dvSum 转成字符串,显示到界面上的 lab2(一个 QLabel 标签)上。

const static double PI = 3.1415;

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));
}

4.6连接信号与槽

  • lEdit这是一个输入框(QLineEdit),你在界面上输入内容的地方。

  • SIGNAL(textChanged(QString))这是一个信号,意思是“当输入框里的内容发生变化时”。

  • this指当前的窗口或对话框对象。

  • SLOT(CalcBallVolume())这是一个槽函数,意思是“执行CalcBallVolume这个函数”。

connect(lEdit,SIGNAL(textChanged(QString)),this,SLOT(CalcBallVolume()));

4.7完整dialog.cpp代码

#include "dialog.h"

#include <QGridLayout> // QGridLayout(表格布局)
const static double PI = 3.1415;

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{

    /*
    QLabel *lab1,*lab2;// 显示圆球的半径和体积
    QLineEdit *lEdit;// 编辑按钮
    QPushButton *pbt;// 命令按钮
    */

    // 创建第一个标签(提示用户)
    lab1 = new QLabel(this);
    lab1->setText(tr("请输入圆球的半径:"));

    // 创建第二个标签(计算圆球体积的结果)
    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()
{

}

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));
}