Qt编程基础

2023-10-30

一、信号与槽

1、什么是信号与槽?

信号和槽是用于对象之间的通信,它是Qt的核心机制,在Qt编程中有着广泛的应用。如果想学好Qt,一定要充分掌握信号的槽的概念与使用。

2、信号和槽的代码实例

在Qt中,发送对象、发送的信号、接收对象、槽可以通过很多种方式连接。下面通过一些例子逐一做演示,如下:

2.1、Qt4使用宏

在Qt4及之前的版本基于connect+宏实现信号与槽绑定,其中发送信号和槽函数需要用 SIGNAL() 和 SLOT() 来进行声明,connect函数声明如下:

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, 
    const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

比如点击登录按键完成登录的例子,代码可以这样写:

// 槽函数声明
private slots:
    void login();

通过connect绑定槽函数,如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 登录按键绑定槽函数
    connect(this->ui->btn_ok, SIGNAL(clicked(bool)), this, SLOT(login()));

}

void MainWindow::login()
{
    QString username = ui->lineEdit_username->text();
    QString password = ui->lineEdit_password->text();

    if (username == "jack" && password == "12345") {
        qDebug() << "login success";
    } else {
        qDebug() << "login fail";
    }
}

注意:

  • 声明槽函数要使用private slots或public slots关键字
  • 信号和槽参数不能包含任何变量名,只能包含类型

2.2、使用Qt Creator添加信号的槽函数

通过Qt Creator 界面来完成发送信号和槽函数的连接,比如右键点击一个按钮,然后选择“转到槽”:

在这里插入图片描述

Qt Creator会自动生成如下代码,首先是槽函数的声明:

// 槽函数声明
private slots:
    void on_btn_cancel_clicked(bool checked);

槽函数实现,如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btn_cancel_clicked(bool checked)
{
    
}

使用这种方法不需要使用connect函数将信号与槽函数做连接。 这里槽函数的命名有一定的规则,一般是 on_objectname_signal 这样来命名的。这种方法优点是减少了手动敲代码的工作量,缺点是究竟有哪些信号与槽函数做了连接不易被发现,没有connect 函数看起来直观。

2.3、Qt5新connect函数

Qt5推出了新的connect函数,不需要使用SIGNAL()和SLOT()宏,可以在编译时做类型检查,connect函数声明如下:

QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, 
    const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

使用这种方法槽函数的声明不需要放到slots中,只要像普通的函数一样声明就可以了,类型需要与信号保持一致,下面给登录按键绑定槽函数,如下:

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    // 声明槽函数,与普通的成员函数一样
    void login();

private:
    Ui::MainWindow *ui;
};

绑定槽函数

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   
    // 登录按键绑定槽函数
    connect(ui->btn_ok, &QPushButton::clicked, this, &MainWindow::login);
}

void MainWindow::login()
{
    qDebug() << "login";
}

2.4、使用函数指针

在Qt 5版本的connect 函数里,信号与槽函数的参数其实都是函数指针,当信号或槽函数有重载时,使用函数指针可以明确告诉编译器使用哪一个重载函数避免歧义

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

    // 声明两个同名的login函数
    void login();
    void login(int state);

通过函数指针绑定槽函数

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 定义函数指针(注意:声明指向成员函数的指针时,要增加类作用域)
    void (MainWindow::*pfnLoginSlot)() = &MainWindow::login;

    // 登录按键绑定无参槽函数
    connect(ui->btn_ok, &QPushButton::clicked, this, pfnLoginSlot);
}

void MainWindow::login()
{
    qDebug() << "login";
}

void MainWindow::login(int state)
{
    qDebug() << "login state";
}

2.5、使用Lambda表达式

在connect函数中,槽函数参数可以改用Lambda表达式的方式来进行传参。使用 Lambda表达式的好处是代码的书写更加方便快捷,同时不需要在类中对槽函数做任何的声明了

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 使用Lamdbda表达式作为槽函数
    connect(ui->btn_ok, &QPushButton::clicked, this, [=](){
        qDebug() << "login";
    });
}

3、小结

信号与槽提供了一种事件触发机制,发送者与接收者通过connect链接在一起,发送者与接收者之间是松耦合

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt编程基础 的相关文章

  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • 如何使用 qt 库中的调试符号为 qt 5.5 创建开发 shell

    我有一个开发外壳buildInputs条目包括qt55 qtbase 这很好用 今天 我在 qt 库中发生了段错误 我想要带有调试符号的 qt 库 我看了一下nixpkgs pkgs development libraries qt 5 5
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 在 QtCreator 中调试时如何查看 qDebug 消息

    我正在从 Eclipse CDT 带有 Qt 集成插件 过渡到 QtCreator 2 0 但仍有一件事困扰着我 QtCreator 当我在 QtCreator 中调试时 我在Application output tab直到我停止正在调试的
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • Qt QML MenuItem iconSource不显示

    我有一个非常简单的设置只是为了说明问题 import QtQuick Controls 1 4 import QtQuick Window 2 2 ApplicationWindow visible true width 640 heigh
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • 如何使用样式表删除 QWizard 中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我已经发布了一个最小的例子here https stackoverflow com q 52538669 8570451 这个问题是由scopchanov从最小的例子中解决的 但是
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • Qt ObjectName() 必须是唯一的吗?

    如标题所示的简单问题 如果我打电话setObjectName 在一个对象上 它是否必须是唯一的 或者只是因为约定而推荐 我已经子类化了QLabel 并希望自动为创建的对象命名 如果这是一个坏主意 我会找到一些设置随机唯一名称的方法 我实际上
  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不

随机推荐

  • substr函数用法详解

    substr string start lt length gt 从string的start位置开始提取字符串 length 要提取字符串的长度 若length为以下任意条件之一时 返回start位置到串尾的所有字符 length不指定 l
  • 解决ubuntu(16.04版本)和windows电脑之间无法复制粘贴问题

    1 执行下列命令 sudo apt get autoremove open vm tools sudo apt get install open vm tools desktop 安装过程中 yes或者y一路通过 2 然后重启ubuntu就
  • 七夕王者服务器维护,2017年8月8日维护公告,七夕限量飞行祥瑞冰晶魅灵部分服务器放出...

    原标题 2017年8月8日维护公告 七夕限量飞行祥瑞冰晶魅灵部分服务器放出 亲爱的玩家朋友 为保证服务器的运行稳定和服务质量 梦幻西游 所有服务器将于2017年8月8日上午8 00停机 进行每周例行的维护工作 预计维护时间为上午8 00至9
  • db2常用的时间操作(数据库查询)

    请注意 使用时 请把文中空格替换 文中的空格有误 获取当前日期 select current date from sysibm sysdummy1 values current date 获取当前日期 select current time
  • onnx 模型转换与 onnxruntime 和caffe2 推理速度比较

    onnx 模型转换与 onnxruntime 和caffe2 推理速度比较 背景 1 模型转换 2 PC端运行onnx模型 背景 pytorch 模型通常包括网络结构 py文件和模型参数文件 pth 通常需要转换为onnx格式再向其他终端或
  • 【算法】广度/宽度优先搜索(BFS)

    挺好的一篇文章 讲的挺清楚 广度 宽度优先搜索 BFS 算法入门 郭志伟 SYSU raphealguo at qq com 2012 04 27 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历
  • 针对VS2019无法登录问题

    摘要 针对VS2019无法登录问题提出一种可行有效的解决方法 VS2019在提供30天试用期后 会要求用户登录后才能使用 但VS2019提供的登录微软账户方法非常不友好 本文将通过更改登录设置方法实现VS2019的简单快捷登录 问题描述 一
  • dotNet基于office实现word转pdf

    20171228 WordToPdf byDotNet 基于Office的实现步骤 主要是利用了 office com 组件中的 Microsoft Office Interop word dll 动态链接库文件可以通过 c 代码实现对 w
  • 科普文章|通过Polkassembly平台使用MetaMask参与Moonbeam链上民主治理

    Moonriver上的Runtime 1200升级引入了一个民主预编译的功能 允许网络参与者使用MetaMask钱包参与链上治理投票 此外 近期Polkassembly与Mooriver集成 这是一个供任何人可以讨论并参与基于Substra
  • scala机器学习实战(一) 保险数据预测分析

    scala机器学习之保险数据预测分析 数据资料来源 此文章数据内容来源于Scala Machine Learning Projects 2018版 一书 本书分为是一个章节 本文章内容来自于第一章节 书本链接 Scala Machine L
  • unity图片相似度2

    using System Collections using System Collections Generic using System IO using UnityEngine using UnityEngine UI public
  • OneOS 定位功能测评+开发详解

    本文分享自中移OneOS微信公众号 定位功能测评 开发详解 本期严同学为了给大家展现 OnePos定位服务能力 复现地铁轨迹线路 坐了大半天的地铁 老辛苦了 这期视频大家一定要看看喔 点此跳转演示视频 想要一比一复原开发流程的小伙伴 可以看
  • Windows10 屏幕底部有一条蓝线挡住任务栏底部解决办法

    Windows10 屏幕底部有一条蓝线挡住任务栏底部解决办法 网上无效解决办法 跳出睡眠模式 网上无效解决办法 1 任务栏设置 选择总是隐藏标签 这个在我这一版的Windows10早就没有这个选项了 其他的选项也都没有用 2 屏幕物理损坏或
  • Java HTTP 代理服务器

    Java HTTP 代理服务器 在当今的企业开发环境中 我们不得不与代理打交道 通常是作为系统管理员 在大多数情况下 应用程序将配置为系统的默认设置 但如果您想对应用程序进行非常严格的控制 例如代理设置 对于这种情况 Java允许使用 AP
  • AWVS 15.6 使用教程

    目录 介绍 版本 AWVS具有以下特点和功能 功能介绍 Dashboard功能 Targets功能 Scans功能 Vulnerabilities功能 Reports功能 Users功能 Scan Profiles功能 WAFs功能 Pro
  • 英语音标表、48个国际音标发音表、falsh音标学习视频

    随着时代的进步 世界变得越来越小了 掌握一门外语是必不可少的 其中英语是目前使用最广泛的语言 英语音标 则是掌握英语发音的基础 通过本站英语音标表 falsh音标学习 希望对您有帮助 音标发音表 鼠标移到音标上 稍停留 即发音 48个国际音
  • C语言中getchar()函数的详解

    文章目录 关于getchar 函数的基本作用 getchar 函数基本案例 在循环当中的getchar getchar 函数的作用 清理缓冲区中多个字符 关于getchar 函数的基本作用 getchar 函数顾名思义就是获取一个字符 那么
  • 避坑之路 —— 前后端 json 的注意问题

    当我们在进行开发项目的时候 在前后端需要进行数据之间的传输 那么就会需要到json 而json算是字符串中的一种 1 先说一下前端的 其实这两种都是表示前端希望能收到后端json这样的数据格式 那么我们在后端就需要注意将数据进行转换为jso
  • 透视Matplotlib核心功能和工具包 - Cartopy工具包

    Cartopy是用于在Matplotlib上绘制地理地图的第三方工具包 Cartopy具有各种各样的功能 可以满足许多不同的用户群体 在这里 我们将尝试介绍企业中通常使用的大多数功能 地理地图以经度和纬度绘制 均以度为单位 经度绘制在x轴上
  • Qt编程基础

    一 信号与槽 1 什么是信号与槽 信号和槽是用于对象之间的通信 它是Qt的核心机制 在Qt编程中有着广泛的应用 如果想学好Qt 一定要充分掌握信号的槽的概念与使用 2 信号和槽的代码实例 在Qt中 发送对象 发送的信号 接收对象 槽可以通过