QT 学习笔记(二)

article/2025/10/25 0:57:33

文章目录

  • 一、标准信号和槽
    • 1. 准备工作
      • 1.1 main.c
      • 1.2 widget.cpp
    • 2. 添加按钮
      • 2.1 widget.h
      • 2.2 widget.cpp
      • 2.3 运行结果
    • 3. 信号和槽(重点)
      • 3.1 信号
      • 3.2 自定义槽
      • 3.3 widget.h
      • 3.4 widget.cpp
      • 3.5 运行结果
  • 二、两个独立窗口
    • 1. 添加新窗口
    • 2. 自定义信号
    • 3. 窗口关联
    • 4. 代码和实现效果
      • 4.1 实现过程
      • 4.2 子窗口头文件 subwidget.h
      • 4.3 子窗口源文件 subwidget.cpp
      • 4.4 主窗口头文件 widget.h
      • 4.5 主窗口源文件 widget.cpp
      • 4.6 实现结果

由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见QT 学习笔记(一)

一、标准信号和槽

1. 准备工作

  • 这里需要注意在模板选择转变为 Application ,后续步骤相同。

在这里插入图片描述

1.1 main.c

  • 在执行完 Widget w; 语句后,并不会立马执行 w.show(); ,还要先执行 Widget 的构造函数。
  • 因此,我们在编写程序时主程序尽量不要改动,保持如下状态即可。程序的编写在他对应的 .h 和 .cpp 文件当中即可。
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;  // 执行 Widget 的构造函数w.show();return a.exec();
}

1.2 widget.cpp

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

  • 后续代码的编写均在 widget.h 和 widget.cpp 当中进行。
  • widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
};#endif // WIDGET_H
  • widget.cpp
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{
}Widget::~Widget()
{}

2. 添加按钮

  • 如果直接在 widget.cpp 当中,进行按钮的编写操作,此时运行并不会产生按钮。
  • 因为,局部变量放在栈区,执行完就释放,构造函数调用结束就没有了,再执行后面的 show 程序当中不会产生按钮。
  • 因此,我们在头文件当中进行按钮的定义,在源文件当中进行按钮的调用即可。

2.1 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
private:QPushButton b1;QPushButton *b2;
};#endif // WIDGET_H

2.2 widget.cpp

#include "widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{b1.setParent(this);b1.setText("^_^");b1.move(100,100);b2 = new QPushButton(this);b2->setText("abc");
}Widget::~Widget()
{}

2.3 运行结果

在这里插入图片描述

  • 此时,我们点击按钮并不会产生反应,原因是缺少 信号和槽

3. 信号和槽(重点)

  • QT 做处理是主要是借助信号和槽,其核心便在于信号和槽。
  • 信号类似于短信。
  • 槽函数类似于接收短信的手机。

3.1 信号

  • 信号:就是一个软件模拟的中断(类似于单片机那种的)。
  • 信号函数及其详解如下:
    connect(&b1,&QPushButton::pressed,this,&Widget::close);// &b1:信号发出者,指针类型。// &QPushButton::pressed:处理的信号。(&发生者的类名::信号名字)// this:信号接收者。// &Widget::close:槽函数,信号处理函数。(&接收的类名::槽函数名字)
  • 发出什么样的信号,需要进入头文件的帮助文档(光标放在头文件,按 f1 进入,按两下 f1 全屏)进行判断。如果在该头文件的帮助文档当中,没有发现 signals,便寻找他的父类。

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

3.2 自定义槽

  • 自定义槽:普通函数的用法。
  • 在 QT5 当中,自定义槽可以是任意的成员函数普通全局函数静态函数
  • 槽函数需要和信号一致(参数,返回值)。
  • 由于信号没有返回值,所以槽函数一定没有返回值
  • 自定义槽函数是需要在对应头文件当中声明,在源文件当中编写槽函数的功能。

3.3 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();void myslot();private:QPushButton b1;QPushButton *b2;
};#endif // WIDGET_H

3.4 widget.cpp

#include "widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{b1.setParent(this);b1.setText("close");b1.move(100,100);b2 = new QPushButton(this);b2->setText("abc");connect(&b1,&QPushButton::pressed,this,&Widget::close);connect(b2,&QPushButton::released,this,&Widget::myslot);connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
}void Widget::myslot()
{b2->setText("123");
}Widget::~Widget()
{}

3.5 运行结果

在这里插入图片描述

  • 点击 close 会关闭窗口。
  • 点击 abc 会产生如下变化:

在这里插入图片描述

二、两个独立窗口

1. 添加新窗口

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

2. 自定义信号

  • 在头文件下 signals:
  • 信号必须有 signals 关键字来声明。
  • 信号没有返回值,但可以有参数。
  • 信号就是函数的声明,只需声明,无需定义。
  • 使用:emit mysignal();

3. 窗口关联

  • 在主窗口头文件当中包含子窗口的头文件。
  • 在子窗口当中自定义槽函数发生信号(emit mysignal();) ,在主窗口中对信号进行接收。
  • 在主窗口中也需要自定义接收信号槽函数。
  • 有自定义槽函数发生信号,就一定要有自定义才函数接收信号。
  • 自定义槽函数要在头文件当中声明,源文件当中引用和实现,注意每个自定义槽函数的父类是什么。

4. 代码和实现效果

4.1 实现过程

在这里插入图片描述

4.2 子窗口头文件 subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H#include <QWidget>
#include <QPushButton>class subwidget : public QWidget
{Q_OBJECT
public:explicit subwidget(QWidget *parent = nullptr);void setslot();  //发送信号signals:void mysignal();public slots:private:QPushButton b;
};#endif // SUBWIDGET_H

4.3 子窗口源文件 subwidget.cpp

#include "subwidget.h"subwidget::subwidget(QWidget *parent) : QWidget(parent)
{this->setWindowTitle("小弟");b.setParent(this);b.setText("切换到主窗口");b.move(150,150);connect(&b,&QPushButton::released,this,&subwidget::setslot);resize(400,300);
}void subwidget::setslot()  //发送信号
{emit mysignal();
}

4.4 主窗口头文件 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>
#include "subwidget.h"  //子窗口头文件class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void changewin();  //改变窗口void dealsub();  //处理子窗口信号private:QPushButton a;subwidget w;
};#endif // WIDGET_H

4.5 主窗口源文件 widget.cpp

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("老大");//this->setWindowTitle("老大");a.setParent(this);a.setText("切换到子窗口");a.move(150,150);//显示子窗口//w.show();connect(&a,&QPushButton::released,this,&Widget::changewin);//处理子窗口的信号connect(&w,&subwidget::mysignal,this,&Widget::dealsub);//定义窗口大小resize(400,300);
}void Widget::changewin()
{//子窗口显示w.show();//本窗口隐藏this->hide();
}void Widget::dealsub()
{//主窗口显示this->show();//子窗口隐藏w.hide();
}Widget::~Widget()
{}

4.6 实现结果

  • 通过点击 切换到子窗口 和切换到主窗口 可以实现窗口的来回切换。

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


http://chatgpt.dhexx.cn/article/RGNEwOeq.shtml

相关文章

Qt学习 - 总

Qt学习 学习中的错误常用快捷键杂项布局信号与槽数据库相关QSS选择器 {property:value}Qt样式表设置函数 setStyleSheet()QSS文本属性 事件QMouseEvent&#xff1a;鼠标事件键盘事件QWheelEvent&#xff1a;滚轮事件QCloseEvent&#xff1a;关闭事件QTimerEvent&#xff1a;超时…

Qt日常学习

2022/07/28 使用Visual Studio2019 搭配 Qt5.14&#xff0c;可视化Qt界面使用QtDesigner。 若只使用代码来做界面太麻烦&#xff0c;效率低&#xff1b;只使用可视化界面进行拖拽效率高但无法实现全部功能。使用代码可视化结合的方式能够实现绝大部分功能。 练习1&#xff1…

QT入门学习(一):什么是QT

QT 是什么&#xff1f; QT是一个跨平台C图形用户界面应用程序开发框架。它不仅可以开发GUI程序&#xff0c;也可以开发非GUI程序。我们通常使用QT开发GUI程序。 它可以开发Windows、Linux、Mac平台的应用程序。也可以开发移动端应用程序以及嵌入式程序。 QT 模块 QT 有模块…

一位大佬对于 Qt 学习的最全总结(三万字干货)

击上方“C语言与CPP编程”&#xff0c;选择“关注/置顶/星标公众号” 干货福利&#xff0c;第一时间送达&#xff01; 分享一位大佬 Github 上关于 Qt 学习的总结。作者无私分享了一百多个自定义控件以及几本 Qt 的书籍&#xff08;C Qt&#xff09;&#xff0c;特此引用这个大…

QT学习笔记(一)——QT基础

QT学习笔记&#xff08;一&#xff09;——QT基础 文章目录 QT学习笔记&#xff08;一&#xff09;——QT基础前言一、QT是什么&#xff1f;二、基础内容1.pro文件规则及含义2. Widget头文件3. QT坐标系的定义4. QApplication应用程序类5.按钮&#xff1a;QPushButton6. 信号和…

Qt初学者的一些学习方法、参考资料

1&#xff0c;简介 最近有一些朋友加我&#xff0c;询问Qt入门学习的方法、资料 我基本都一一作答&#xff0c;根据情况给出了一些参考意见 感觉很多新手开始学习时很迷茫&#xff0c;不知道学习哪些方面、看什么资料 这里干脆写一篇文章&#xff0c;把自己的学习过程给大家介…

Qt学习之C++基础

前言 用了大概2个月的时间&#xff0c;学了Qt&#xff0c;然后开发一个小项目&#xff0c;总的来说&#xff0c;在主机GUI程序中&#xff0c;相比Java的Swing和JavaFX&#xff0c;个人感觉Qt的界面设计更加简便一点&#xff0c;灵活性更高一些&#xff0c;然后下边就主要简述一…

Qt学习之Qt基础入门(中)

1. 前言 上一篇博客&#xff0c;总结了Qt的一些基础用法&#xff0c;这篇博客继续跟视频学习Qt的常用方法 Qt入门系列&#xff1a; Qt学习之C基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门(中) Qt学习之Qt基础入门(下) 本文原创&#xff0c;创作不易&…

Qt学习之Qt基础入门(上)

1. 前言 上一篇博客&#xff0c;简单的介绍了一下C的面向对象编程&#xff0c;这篇博客就主要是用来入门Qt&#xff0c;废话不多说&#xff0c;开干&#xff01; Qt入门系列&#xff1a; Qt学习之C基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门(中) Qt学习…

qt基础入门教程

1、t的介绍、优点、成功案例 5.8.0 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。爸是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 推荐安装 wps linux 桌面环境 虚拟机软件 屏幕共…

Qt入门教程100篇(已完结)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「CSDN学院」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;Qt基础教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&…

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

QT入门到实战学习笔记

学习笔记 最新QT从入门到实战完整版|传智教育_哔哩哔哩_bilibili 目录 1.创建一个QT文件 1.1命名规范 1.2快捷键 2QPushButton创建 2.1防止汉语乱码 2.2对象树 2.3Qt窗口坐标体系 3信号和槽机制 3.1自定义信号和槽 3.1.1自定义信号&#xff1a; 3.1.2自定义槽&#…

pdflatex和xelatex的使用差别和建议

关于pdflatex和xelatex的区别的一些注意点 pdflatex 和xelatex分别是什么我遇到的一些问题 pdflatex 和xelatex分别是什么 pdflatex 和xelatex是latex编译中最常用的编译方式&#xff0c;而且效果一般都是比较好的。 PDFLaTeX命令&#xff1a;PDFTeX程序中的命令&#xff0c;用…

关于MAC解决jupyter中出现nbconvert failed/ xelatex not found on path报错

前言 开开心心的花了半个小时做完了2303的期中测试&#xff0c;结果在导出为pdf的时候提示我500错误&#xff0c;说明为nbconvert failed: xelatex not found on path&#xff0c;我当时就蒙了昂&#xff0c;不过还好考试时间是三个小时&#xff0c;还能浪浪&#xff0c;但是我…

【LaTex使用总结】LaTex,pdflatex,xelatex,xetex等的区别和关系

问题是这样产生的&#xff0c;从本科毕设开始接触LaTex起&#xff0c;使用现成的模板进行编译生成操作&#xff0c;一步步按指示操作也从未深究。 后来使用word较多&#xff0c;LaTex经常是简单模板&#xff0c;也渐渐对LaTex的细节不再感兴趣&#xff0c;近期又开始用LaTex撰写…

pyplot 使用 latex 报错:xelatex not found……

错误提示 发生异常: RuntimeError xelatex not found. Install it or change rcParams[pgf.texsystem] to an available TeX implementation. 原始参数&#xff1a; plt.rcParams.update({"pgf.texsystem": "xelatex","text.usetex": True,# u…

Winedt为什么可以用pdfLaTex编译中文(pdfLaTex和XeLaTex的使用)

文章目录 Winedt为什么可以用pdfLaTex编译中文查看Winedt的默认编译器&#xff1a; 1.XeLaTex和pdfLaTex的关系2.Winedt中使用pdfLaTex编译中文的tex3.原因4.验证 Winedt为什么可以用pdfLaTex编译中文 前言&#xff1a;如果你只是想用Winedt实现LaTex中英混排那么可以直接选择…

recipe terminated with fatal error: spawn xelatex enoent.

vscode配置latex的小问题 问题产生的原因是环境变量没有配置好。所以只需要把环境变量配置好就可以了。 1、 打开textlive安装的路径&#xff08;…\textlive\2022\bin\win32&#xff09;&#xff0c;比如我的就是C:\texlive\2022\bin\win32 2、编辑环境变量&#xff1a; 编…

TeXstudio报错: fwrite: Broken pipe xelatex.exe

错误&#xff1a; 解决方法&#xff1a; 选项->设置TeXstudio 默认编译器换成PdfLaTex&#xff1a; 问题解决。