2023-12-05 Qt学习总结2

news2025/2/25 16:21:22

点击 <C 语言编程核心突破> 快速C语言入门


Qt学习总结

  • 前言
  • 五 Hello Qt!
  • 六 Qt控件和事件
  • 七 Qt信号和槽
  • 八 Qt自定义信号和槽
  • 总结


前言

要解决问题: 学习qt最核心知识, 多一个都不学.


五 Hello Qt!

现在我们已经有了一个空窗口工程, 传统上, 我们要实现一个"Hello Qt !"的程序,

双击Widget.ui, 进入设计界面
在这里插入图片描述
鼠标右键点击Label不要松手, 拖入右边的界面中
在这里插入图片描述
双击TextLabel, 改成Hello Qt !,
在这里插入图片描述
鼠标右键Hello Qt !, 点击改变格式文本, 更改文字的字号,大小.
在这里插入图片描述
更改字体: 点击Hello Qt !在属性中点击font字体, 调整字体.
在这里插入图片描述
运行程序:

在这里插入图片描述
效果:
在这里插入图片描述
恭喜你, 写了第一个Qt程序.

六 Qt控件和事件

Qt的控件可以分为基本控件和高级控件两种类型,其中基本控件包括按钮、标签、文本框、进度条等常用控件,

高级控件包括表格、树形控件、列表、对话框等更加复杂的控件。

在这里插入图片描述

通过这些控件的组合和设置属性,我们可以实现我们所需的用户界面。

Qt的事件机制允许我们在用户交互时捕捉到相应的事件,如按钮被单击、鼠标移动、键盘按下等。

在这里插入图片描述

我们可以通过重载控件的事件处理函数来处理这些事件,例如QPushButton的clicked()信号就是当用户单击该按钮时触发的事件。

在这里插入图片描述

Qt的控件和事件机制为我们设计和实现用户界面提供了强大的支持,使得我们可以轻松地实现复杂的图形化交互应用程序。

七 Qt信号和槽

Qt信号和槽是一种重要的机制,用于在对象之间进行通信。

它们是Qt框架中最强大的特性之一。

信号是一种事件,当发生某些特定的情况时,对象发射信号。

例如,当用户单击按钮或窗口关闭时,对象会发射相应的信号。

槽是一种方法,当一个信号发射时,与之相关联的槽将被调用。

槽可以执行任何操作,例如更改部件属性、计算数据等等。

一个对象可以有多个信号和槽,它们可以相互连接。

通过使用信号和槽,Qt提供了一种非常方便的方法来实现事件处理和通信。

它可以减少代码的重复性,使程序更加模块化和易于维护。

使用信号和槽需要遵循以下步骤:

  1. 定义信号:在类中声明信号,以便对象可以发射它。

  2. 定义槽:在类中声明槽,以便当信号被发射时可以调用它.

在这里插入图片描述
3. 连接信号和槽:使用QObject::connect()函数连接信号和槽。

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

    // 链接信号与槽 谁发出信号 发出什么信号 谁处理信号 怎么处理
    connect(ui->CancelButton, &QPushButton::clicked, this,
            &Widget::on_CancelButton_clicked);
}

以下是一个简单的示例代码:

Widget.h, 除了pushButton_clicked()函数, 其余的基本自动给出

#ifndef WIDGET_H
#define WIDGET_H

#include <QMessageBox>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui
{
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

  private slots:
    void pushButton_clicked();

  private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

main.cpp, 全部自动给出

#include "Widget.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>

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

    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "Learn_10_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }
    Widget w;
    w.show();
    return a.exec();
}

Widget.cpp , 除了自己实现pushButton_clicked(), 以及连接clicked信号与pushButton_clicked槽函数, 其余自动给出

#include "Widget.h"
#include "./ui_Widget.h"

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

    // button发出clicked信号, widget接收到信号, 运行pushButton_clicked
    connect(ui->pushButton, &QAbstractButton::clicked, this,
            &Widget::pushButton_clicked);
}

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

void Widget::pushButton_clicked()
{
    QMessageBox::information(this, "信息", "按钮被点击");
}

Learn_10_zh_CN.ts, 全部自动给出

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN"></TS>

ui_Widget.h, 拖控件, 改字体, 其余全部自动给出.

/********************************************************************************
** Form generated from reading UI file 'Widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_WIDGET_H
#define UI_WIDGET_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Widget
{
public:
    QWidget *widget;
    QVBoxLayout *verticalLayout;
    QLabel *label;
    QPushButton *pushButton;

    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName("Widget");
        Widget->resize(271, 126);
        widget = new QWidget(Widget);
        widget->setObjectName("widget");
        widget->setGeometry(QRect(20, 10, 227, 107));
        verticalLayout = new QVBoxLayout(widget);
        verticalLayout->setObjectName("verticalLayout");
        verticalLayout->setContentsMargins(0, 0, 0, 0);
        label = new QLabel(widget);
        label->setObjectName("label");
        QFont font;
        font.setFamilies({QString::fromUtf8("\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B")});
        font.setBold(true);
        label->setFont(font);

        verticalLayout->addWidget(label);

        pushButton = new QPushButton(widget);
        pushButton->setObjectName("pushButton");
        QFont font1;
        font1.setFamilies({QString::fromUtf8("\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B")});
        font1.setPointSize(14);
        font1.setBold(true);
        pushButton->setFont(font1);

        verticalLayout->addWidget(pushButton);


        retranslateUi(Widget);

        QMetaObject::connectSlotsByName(Widget);
    } // setupUi

    void retranslateUi(QWidget *Widget)
    {
        Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
        label->setText(QCoreApplication::translate("Widget", "<html><head/><body><p><span style=\" font-size:36pt; font-weight:700;\">Hello QT !</span></p></body></html>", nullptr));
        pushButton->setText(QCoreApplication::translate("Widget", "PushButton", nullptr));
    } // retranslateUi

};

namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_WIDGET_H

以上代码基本都是Qtcreator的框架自动给出的, 真正需要我们编写的只是UI部分(拖动控件改个名字)和信号与槽连接的部分, 及槽函数, 看着很多, 其实如果熟悉流程, 不会超过五分钟.

运行效果:
在这里插入图片描述
在这里插入图片描述

总之,信号和槽是Qt的核心特性之一,使得对象之间的通信变得非常简单。在编写Qt应用程序时,通常需要使用信号和槽机制来实现事件处理和数据通信。

八 Qt自定义信号和槽

Qt提供了一些常见的信号和槽, 如按钮的clicked()信号和QTimertimeout()信号,但有时你需要定义自己的信号和槽。

以下是定义自定义信号和槽的步骤:

  1. 定义信号:在类中声明一个信号,可以理解为一个函数声明,但没有实现。

注意,使用自定义信号和槽时,必须在类定义中包含Q_OBJECT宏,并且该类必须是QObject的子类。

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QDebug>
#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT
  public:
    explicit MyClass(QObject *parent = nullptr);
    void myMethod();

  signals:
    void mySignal(int);

  public slots:
    void mySlot();
};

#endif // MYCLASS_H
  1. 激发信号:在类的某个方法中使用emit关键字来激发该信号。
void MyClass::myMethod()
{
    int value = 1000;
    emit mySignal(value);
}
  1. 定义槽:在类中声明一个槽,可以理解为一个函数,必须在类外有定义, 且为public, 否则无法调用。
void MyClass::mySlot()
{
    qDebug() << "mySlot:";
}

  1. 连接信号和槽:在应用程序的合适位置使用connect()方法来连接信号和槽。

连接一个信号和槽,使得当信号激发时,槽函数将被自动调用。

这种connet()的方法是将信号放在SIGNAL这个宏中, 宏将函数扩展为字符串"mySignal(int)", 注意, 对于含有参数的信号, 其格式要求是函数名(形参类型), mySignal(int)

对于槽函数则放在SLOT宏中, 也会将函数扩展为字符串, 函数格式要求与信号一致.

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

    myc = new MyClass;
    myt = new QTimer;

    // 谁, 发出信号, 谁, 接收信号做什么
    connect(myc, SIGNAL(mySignal(int)), myt, SLOT(start(int)));
    connect(myt, SIGNAL(timeout()), myc, SLOT(mySlot()));
}

  1. 设计一个按钮pushbutton, 按下调用myMethod()函数, 设计一个stop按钮, 按下调用Qtimer的stop()函数.

void Widget::on_pushButton_clicked()
{
    this->myc->myMethod();
}

void Widget::on_stopButton_clicked()
{
    this->myt->stop();
}

在这里插入图片描述
在这里插入图片描述

在上面的例子中,当按下pushbutton时, mySignal信号被激发,接着QTimerstart()方法将被调用,而在QTimer超时时,mySlot方法将被调用, 输出 "mySlot"

当按下stop按钮时, 计时器中断, 不再调用mySlot().

使用自定义信号和槽可以使Qt应用程序更加灵活和可扩展,因为你可以定义和连接任何你需要的信号和槽,以实现特定的功能和交互。


总结

五 Hello Qt!
六 Qt控件和事件
七 Qt信号和槽
八 Qt自定义信号和槽


点击 <C 语言编程核心突破> 快速C语言入门


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

104. 二叉树的最大深度(Java)

目录 解法&#xff1a; 官方解答&#xff1a; 方法一&#xff1a;深度优先搜索 方法二&#xff1a;广度优先搜索 思路与算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根…

mysql pxc高可用离线部署(三)

pxc学习流程 mysql pxc高可用 单主机 多主机部署&#xff08;一&#xff09; mysql pxc 高可用多主机离线部署&#xff08;二&#xff09; mysql pxc高可用离线部署&#xff08;三&#xff09; mysql pxc高可用 跨主机部署pxc 本文使用docker进行安装&#xff0c;主机间通过…

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…

CGAL的3D简单网格数据结构

由具有多个曲面面片的多面体曲面生成的多域四面体网格。将显示完整的三角剖分&#xff0c;包括属于或不属于网格复合体、曲面面片和特征边的单元。 1、网格复合体、 此软件包致力于三维单纯形网格数据结构的表示。 一个3D单纯形复杂体由点、线段、三角形、四面体及其相应的组合…

BUUCTF [CISCN2019 华北赛区 Day2 Web1]Hack World 1(SQL注入之布尔盲注)

题目环境判断注入类型 1 2 3 1’ 输入1’报错提示bool(false) 可知是字符型的布尔注入&#xff08;盲注&#xff09; 尝试万能密码 1’ or ‘1’1 已检测SQL注入 猜测某些关键字或者字符被过滤 FUZZ字典爆破 可以看到部分关键字被过滤&#xff0c;包括空格 All You Want Is In …

iOS——定位与地图

平时在写项目的时候可能会遇到需要使用定位服务的地方&#xff0c;比如说获取位置和导航等。因此这里我会使用OC自带的库以及苹果系统的地图来获取定位以及显示在地图上。 开始前的设置 在获取定位前&#xff0c;需要在项目文件的info中添加两个关键字&#xff0c;用于向用户…

ooTD I 这么精致优雅的套装也太好看了吧

精致到每一个细节的国风套装 领口袖口拼接环保毛条 精美的绣花增添浓重的高级感 外套90白鸭绒填充 敲暖和裙子的门襟处 也是做了定制盘扣&#xff0c;外套和裙子单独来穿也很精致

STM32L051使用HAL库操作实例(13)- 读取IAQ-CORE-C传感器实例

目录 一、前言 二、传感器参数 三、STM32CubeMX配置&#xff08;本文使用的STM32CubeMX版本为6.1.2&#xff09;例程使用模拟I2C进行数据读取 1.MCU选型 2.使能时钟 3.时钟配置 4.GPIO口配置 四、配置STM32CubeMX生成工程文件 五、点击GENERATE CODE生成工程文件 六、…

人类的耳朵:听觉的动态范围

作者&#xff1a;听觉健康 听觉的动态范围即可用的听力范围。在坐标系中&#xff0c;它可以表示为以听阈和最大舒适级为界形成的区域&#xff0c;其坐标轴分别为频率和声压级&#xff08;刺激持续时间在某种程度上对其产生影响&#xff09;。是什么因素决定了人类听力的极限&am…

ST-Link usb communication error 解决,如何解决STlink驱动连不上的错误

电脑连接不上ST-Link&#xff0c;怎么办&#xff0c;以下方法可以一条一条试试。 方法1 重启电脑。 方法2 确信自己的电脑驱动是装好了的&#xff0c;没有装好&#xff0c;可以看下面这个链接的驱动装一下。 http://www.openedv.com/docs/tool/dap/ST-LINKV2.html 能在设…

【数据结构(九)】顺序存储二叉树(2)

文章目录 1. 相关概念2. 顺序存储二叉树的遍历 1. 相关概念 从数据存储来看&#xff0c;数组存储方式和树的存储方式可以相互转换&#xff0c;即数组可以转换成树&#xff0c;树也可以转换成数组&#xff0c;看右面的示意图。 转换原则:     1.上图的二叉树的结点&#xff…

【PHP】php发送邮箱验证码格式美化,样式美化

效果展示&#xff1a; 格式美化前 格式美化后 代码 大多数框架都自带有封装好的发送email方法&#xff0c;就不多赘述&#xff0c;主要写格式&#xff1a; <? php// 验证码过期时间 $expire 120; // 发件人邮箱 $from_email xx163.com; // 收件人 $to_email to163.com…

48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

文章目录 一、简介二、限流器与熔断器在微服务中的作用1.限流器 &#xff1a; 对某个接口单位时间内的访问量做限制2. 熔断器&#xff1a;当服务连续报错&#xff0c;超过一定阈值时&#xff0c;打开熔断器使得服务不可用 三、具体实现1. 限流器实现逻辑&#xff08;以令牌桶算…

yolov8火灾报警检测和烟雾检测

火灾和烟雾的跟踪和检测使用YOLOv8 介绍 该代码库包含使用YOLOv8在实时视频中跟踪和检测火灾和烟雾的代码。该项目使用预训练的YOLOv8模型在给定的视频帧中识别火灾和烟雾的存在&#xff0c;并在后续帧中进行跟踪。 应用场景 火灾烟雾检测技术可以应用于各种公共场所&…

特殊进程之守护进程

文章目录 1、守护进程的概念2、如何查看守护进程3、编写守护进程的步骤3.1 创建子进程&#xff0c;父进程退出3.2 在子进程中创建新会话3.3 改变当前工作目录3.4 重设文件权限掩码3.5 关闭不需要的文件描述符3.6 某些特殊的守护进程打开/dev/null 4、守护进程代码示例 1、守护进…

L1-028:判断素数

题目描述 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于231的需要判断的正整数。 输出格式&#xff1a; 对每个需要判断的…

深入解析Linux内核网络-拥塞控制系列(二)

上篇文章&#xff1a;深入解析Linux内核网络-拥塞控制系列(一&#xff09;对Linux内核网络中网络拥塞框架的框架进行了分析。本次针对具体的Cubic拥塞控制算法进行简单分析。在进行代码的梳理前&#xff0c;同样还是先来看一下相关概念、原理&#xff1a; 在上一篇文章中也提到…

TypeScript入门实战笔记 -- 开篇 为什么要选择 TypeScript ?

typescript 在线编辑器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

PHP 二维码内容解析、二维码识别

目录 1.首先是一些错误的示例 2.正确示例 3.二维码解析 4.完整示例&#xff0c;含生成 5.代码执行结果 6.参考文档 1.首先是一些错误的示例 本示例使用的是php7.3 通过搜索各种结果逐个尝试以后&#xff0c;得出一个可使用版本 解析错误经历&#xff1a;vendor核心报错 …