【Qt】工具介绍和信号与槽机制

文章目录

  • [Qt Creater界面介绍](#Qt Creater界面介绍)
  • [Qt信号与槽机制原理(Signal & Slot)](#Qt信号与槽机制原理(Signal & Slot))

Qt Creater界面介绍


【Qt工具】

Qt Assistant(Qt助手)

Qt Designer(Qt设计师)

Qt Example and Demos(QT演示程序与案例)

Qt Linguist(Qt语言)


QMainWindow(主窗口类):工具栏、菜单栏、状态栏,类似应用程序的标准窗口

QWidget(可视界面):创建界面对各种界面组件都可以支持

QDialog(对话框类):创建工程基于对话框的界面

Qt信号与槽机制原理(Signal & Slot)

1.信号(singal):信号本质是事件 。信号展现方式就是函数。当某一个事件发生滞后,则发出一个信号(signal)

2.槽(slot):对信号响应的函数,槽就是一个函数。

槽函数与普通函数的区别:

槽函数可以与一个信号关联,当信号被发射的时候,关联的槽函数被自动执行处理。信号与槽关联是使用QObject::connect()函数进行实现

  • 信号函数只需要声明(不需要实现),而槽函数需要实现
  • 信号和槽机制底层是通过函数之间进行相互调用实现的。每个信号都可以用函数来表示,成为信号函数。每个槽也可以用函数表示,称为槽函数。
  • 槽函数可以用public slots/protected slots/private slots修饰。signals和slots是Qt开发中在C++语言之上扩展的关键词,专门用于指明信号函数和槽函数。
  • QOject::connect(发送信号的对象object1,信号signal,信号接收者object2,槽函数slot)

3.信号与槽机制连接方式

  • 一个信号可以跟另一个信号相连
  • 同一个信号可以跟多个槽相连
  • 同一个槽可以响应多个信号

4.信号和槽机制优势:松散耦合

一个类若要支持信号和槽,必须从QObject的子类继承。Qt信号和槽机制不支持对模板的使用

5.信号与槽机制效率:增加对象之间的灵活性,但是也会损失一些性能。通过传递一个信号来调用槽函数将会比直接调用非虚函数运行速度慢,主要原因:

  • 多线程的时候,信号可能需要排队等待
  • 编组/解组传递的参数
  • 安全地遍历所有的关联
  • 需要定位接收信号的对象

信号与槽实战

头文件

cpp 复制代码
#ifndef DIALOG_H
#define DIALOG_H

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

QT_BEGIN_NAMESPACE
namespace Ui {
class Dialog;
}
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::Dialog *ui;

private:
    QLabel *lab1,*lab2;
    QLineEdit *lEdit;
    QPushButton *pbt;
private slots:
    void CalcBallVolume();

};
#endif // DIALOG_H

源文件

cpp 复制代码
#include "dialog.h"
#include "ui_dialog.h"

const static double PI=3.1415;

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    
    //提示用户输入半径
    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()
{
    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;
    lab2->setText(tempStr.setNum(dVSum));
}
相关推荐
wjs202414 小时前
Memcached stats 命令详解
开发语言
云技纵横14 小时前
Stream API 从入门到实践:常用操作、易错点与性能建议
开发语言·windows·python
Knight_AL14 小时前
Java 17 新特性深度解析:记录类、密封类、模式匹配与增强的 switch 表达式对比 Java 8
java·开发语言
吴佳浩 Alben14 小时前
Go 1.25.5 通关讲解
开发语言·后端·golang
XXYBMOOO14 小时前
理解 C++ 中的字节序转换函数 `swapEndian`
开发语言·arm开发·c++
小高Baby@14 小时前
深入理解golang的GMP模型
开发语言·后端·golang
a努力。14 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·面试
毕加锁15 小时前
深度解析昇腾Catlass:C++模板元编程与高性能算子开发范式(1)
开发语言·c++
你好音视频15 小时前
FFmpeg FLV编码器原理深度解析
c++·ffmpeg·音视频
鹿野素材屋15 小时前
帧同步场景下的确定性随机数生成:基于时间戳的固定种子设计与实践
java·开发语言