qt5-入门-信号槽理解+QMainWindow

参考:
Qt 深入了解信号槽_w3cschool
https://www.w3cschool.cn/learnroadqt/wz3t1j47.html
Qt MainWindow_w3cschool
https://www.w3cschool.cn/learnroadqt/uqjl1j4b.html

本地环境:
win10专业版,64位


信号槽

最简单的例子:写一个按钮,点击可以关闭主窗口

#include <QPushButton>
...
QApplication a(argc, argv);
QPushButton *btn = new QPushButton("Quit");
QObject::connect(btn, SIGNAL(clicked()), &a, SLOT(quit()));
btn->show();
return a.exec();
  • connect()是在QObject中实现的,所以只要继承了QObject就可以用,并不是只有GUI可用的

  • 一个信号可以与多个槽相连(写多条connect语句,sender是同一个),这些槽都会被调用,但是调用的顺序是不确定的

  • 多个信号可以连接到一个槽(多条connect语句,receiver是同一个),此时只要有任意一个信号发出,这个槽函数就会被调用

  • 一个信号可以连接到另一个信号(slot写的是一个signal),此时表示当第一个信号发出时,第二个信号也被发出

  • 槽也可以取消连接,就是把connect换成disconnect,参数是一样的。不过很少这么写,因为delete一个对象后,Qt会自动取消所有连接到这个对象的槽

  • 如果信号的参数多于槽的参数,那么信号多出的参数会被跳过

    比如const QString &就会被忽略到,传不进去

    connect(ftp, SIGNAL(rawCommandReply(int, const QString &)), this, SLOT(checkErrorCode(int)));
    

Meta-Object系统

提供了两个关键作用:信号槽和内省。内省也称为反射,就是允许程序在运行时获得meta-information,就是类的相关信息。标准c++没有这些动态的meta-information,所以Qt使用了一个独立、用c++实现的工具:moc。Meta-Object系统的工作过程是:

  1. Q_OBJECT声明了一些QObject子类必须实现的内省的函数,如tr()等
  2. Qt的moc实现了Q_OBJECT宏声明的函数和所有信号
  3. QObject的成员函数connect()和disconnect()使用这些内省函数实现信号槽的连接

QMainWindow简单使用

QMainWindow的结构

Qt支持多个工具条显示;Dock window areas是停靠窗口的显示区域,可以放些工具箱什么的。
在这里插入图片描述

QAction

QAction能够根据添加的位置变形,比如放到菜单中就是一个菜单项;放到工具条,就是一个按钮。

举例:假设想弄一个打开命令,这个命令可以放到Menu bar和ToolBar areas中,执行的都是打开文件的命令(先不写connect,只写ui部分)。

文件结构:
在这里插入图片描述
实现效果:
在这里插入图片描述
按住键盘Alt+f(指定的快捷键),可以看到:
在这里插入图片描述
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

// 提前声明
class QAction;

class MainWindow : public QMainWindow{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
// 增加一个QAction指针对象
private:
    QAction *openAction;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QAction>
#include <QMenuBar>
#include <QToolBar>

MainWindow::MainWindow(QWidget *parent) : QMainWindow (parent) {
    // 第一个参数是对动作的描述,是显示的文本信息
    // 第二个参数是parent(父组件),通常是this指针。当父组件被销毁时,与其相关的QAction会自动销毁
    openAction = new QAction(tr("&Open"), this);
    // 设置快捷键
    openAction->setShortcut(QKeySequence::Open);
    // 状态栏的提示内容
    openAction->setStatusTip(tr("打开一个文件"));

    QMenu *file = menuBar()->addMenu(tr("&File"));
    file->addAction(openAction);

    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);

}

MainWindow::~MainWindow(){}

main.cpp

#include <QApplication>
#include "mainwindow.h"

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

    return a.exec();
}

添加响应也很简单。

// mainwindow.h
// 增加
private slots:
    void open();

// mainwindow.cpp
// MainWindow::MainWindow
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
...
void MainWindow::open() {
    QMessageBox::information(NULL, tr("这是标题"), tr("这是内容"));
}

点击菜单栏或者工具栏就会弹出信息窗口,如下:
在这里插入图片描述
其中使用了中文,是因为在mainwindow.cpp的头部加入了宏:

#pragma execution_character_set("utf-8")

为QAction添加图标

使用自定义的图标

在项目上右键点击,选择Qt-Qt Resource File
在这里插入图片描述
命名为res,然后可以看到项目中多了一个:
在这里插入图片描述
qrc是Qt Resource Collection的缩写,是一个XML文件。然后先修改前缀,再添加文件。
在这里插入图片描述
然后在项目名称上右键添加文件。此时文档结构:(Other files和Resources都是QtCreator自己弄的分类,磁盘上是没有这样的文件夹的)
在这里插入图片描述
修改mainwindow.cpp

openAction->setIcon(QIcon(":/pic.jpg"));

解释:因为使用qrc文件定义的,所以路径以:开头;因为定义了前缀(prefix)是/,所以要接着写/,然后再写路径。

效果是:
在这里插入图片描述
需要注意的是,QToolBar的图标大小默认是32x32,菜单默认是16x16,如果提供的图片小于要求的尺寸,Qt不会放大;反之Qt会自动缩小尺寸

使用Qt自带的

在这里插入图片描述
需要增加的代码是:

    // 设置icon
    //enum QStyle::StandardPixmap Icon = (enum QStyle::StandardPixmap)42;
    enum QStyle::StandardPixmap Icon = static_cast<enum QStyle::StandardPixmap>(42);
    openAction->setIcon(QApplication::style()->standardIcon(Icon));

其中注释掉的转换会提示warning,因为是老式风格。用static_cast就可以了。

42是图像的编号,完整的图象是:
在这里插入图片描述
参考这里:

Qt学习笔记之–Qt内置图标一览表_qt自带的图标-CSDN博客
https://blog.csdn.net/wh_19931117/article/details/80444107

代码基本不用改,就是MainWindow.cpp里增加#include < QStyle>可以解决报错。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring cache的使用(Redis)

要在Spring Boot应用中使用Redis作为缓存&#xff0c;你需要遵循一些步骤来配置和使用Redis。以下是使用Spring Cache抽象与Redis进行整合的详细说明&#xff1a; 1. 添加依赖 首先&#xff0c;需要在pom.xml中添加Spring Boot的Redis starter依赖以及缓存的starter依赖。这会…

我的创作纪念日和前端碎碎念

机缘 作为一个前端开发者&#xff0c;我一直热衷于将设计和技术相结合&#xff0c;尽可能提升用户体验。我最初成为创作者的初心源于学习记录&#xff0c;把创作当作一个笔记&#xff0c;希望把自己遇到的问题&#xff0c;以及学习到的实用技巧记录下来&#xff0c;方便学习回…

新书速览|Docker与Kubernetes容器运维实战

帮助读者用最短的时间掌握Docker与K8s运维技能 内容简介 随着云计算和容器技术的发展&#xff0c;Docker与Kubernetes已经成为各个企业首选的部署工具&#xff0c;使用它们可以提高系统的部署效率和运维能力&#xff0c;降低运维成本。本书是一本为初学者量身定制的Docker与Kub…

nodejs+vue+mysql校园失物招领网站38tp1

本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这两者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优化界…

nodejs+vue+ElementUi学生兼职招聘求职系统b8t93

浏览器&#xff1a;谷歌浏览器课题主要分为三大模块&#xff1a;即管理员模块和学生、企业模块&#xff0c;主要功能包括&#xff1a;学生、企业、岗位类型、招聘信息、应聘信息、投诉建议等&#xff1b; 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架&#xff1…

【MBtiles数据索引和服务发布】GeoServer改造Springboot番外系列二

xyz地图服务访问示例&#xff1a;http://192.168.1.240:8081/gmserver/raster/xyz/firstWP:Imagery-raster/{z}/{x}/{y}.jpg 访问示例如下&#xff1a; mbtiles目录结构 根据z&#xff0c;x&#xff0c;y获取对应mbtiles文件路径的工具方法 说明&#xff1a;重点是使用getMb…

STM32——I2C

通信协议见&#xff08;STM32——SPI&#xff09; 一、I2C协议 1.1 I2C协议介绍&#xff1b; I2C是&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线&#xff1b; 有多根通信线&#xff1b; 一根SDA&#xff08;串行通信线&#xff09;&#xf…

PySpark(一)Spark原理介绍、PySpark初体验及原理

Spark简介 Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎&#xff0c;其特点就是对任意类型的数据进行自定义计算。 Spark VS Hadoop 尽管Spark相对于Hadoop而言具有较大优势&#xff0c;但Spark并…

Three.js 纹理贴图 - 环境贴图 - 纹理贴图 - 透明贴图 - 高光贴图

文章目录 Three.js 纹理贴图纹理贴图 map属性纹理贴图的映射方式 texture.Mapping纹理加载器 THREE.TextureLoader监听单个材质监听多个材质 - LoadingManager类 1. 颜色贴图与材质的颜色2.渲染效果&#xff1a;UV坐标 - 描述纹理贴图的坐标自定义顶点UVgeometry.attributes.uv…

Java 数据抓取

大家好我是苏麟 , 今天聊聊数据抓取 . 大家合理使用 注意&#xff0c;爬虫技术不能滥用&#xff0c;干万不要给别人的系统造成压力、不要侵犯他人权益! 数据抓取 实质上就是java程序模拟浏览器进行目标网站的访问&#xff0c;无论是请求目标服务器的接口还是请求目标网页内容…

python基础——池

池的介绍&#xff1a; 提前创建进程池&#xff0c;防止创建的进程数量过多导致系统性能受到影响&#xff0c;在系统执行任务时&#xff0c;系统会使用池中已经创建进程/线程&#xff0c;从而防止资源的浪费&#xff0c;创建的进程/线程可以让多个进程使用&#xff0c;从而降低…

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…

电源模块欠压保护点测试方法分享 纳米软件

电源欠压保护原理 欠压保护是指当电源电压低于一定值时&#xff0c;电源的保护功能会及时断开电路&#xff0c;避免设备受到损坏。电源欠压保护一般是通过一个或多个传感器来检测电压&#xff0c;当电压低于设定值时就会触发电源的保护功能&#xff0c;断开电路&#xff0c;保护…

Git--07--GitExtension

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、GitExtension下载GitExtension官网下载教程 二、GitExtension安装三、GitExtension配置四、GitExtension使用 一、GitExtension下载 官网下载&#xff1a; http…

Docker中安装MySql的遇到的问题

目录 一、mysql查询中文乱码问题 1. 进入mysql中进行查看数据库字符集 2. 修改 my.cnf 中的配置 3. 重启mysql容器&#xff0c;使得容器重新加载配置文件 4. 测试结果 二、主从同步中遇到的问题 2.1 Slave_IO_Running:Connecting 的解决方案 1. 确定宿主机防火墙开放my…

嵌入式学习第十四天!(结构体、共用体、枚举、位运算)

1. 结构体&#xff1a; 1. 结构体类型定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和指针函数、构造数据类型&#xff09;-CSDN博客 2. 结构体变量的定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和…

推荐一个好用的旧版本软件安装包下载地址

最近要下载旧版本的mysql和postman&#xff0c;发现官网和其他博客里边提供的地址&#xff0c;要不都非常难找到相应的下载链接&#xff0c;要不就是提供的从别的地方复制过来的垃圾教程&#xff0c;甚至有的下载还要积分&#xff0c;反正是最后都没下载成功&#xff0c;偶然发…

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时&#xff0c;可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题&#xff0c;专门设计了安全通道堵塞识别摄像机&#xff0c;它具有监测、识别和报警功能&#xff0c;可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…

Mysql-索引创建,索引失效案例

索引创建建议 1 什么情况下需要创建索引&#xff1f; 频繁出现在where 条件字段&#xff0c;order排序&#xff0c;group by分组字段select 频繁查询的列&#xff0c;考虑是否需要创建联合索引&#xff08;覆盖索引&#xff0c;不回表&#xff09;多表join关联查询&#xff0…