Qt 类中Q_OBJECT的作用及其程序代码体现

2023-10-31

Qt中类里为什么要加上Q_OBJECT这个东西呢,原来这是一个Qt定义的宏.它的作用是什么呢?
原来这个宏中包含了Qt中最重要的一个机制:也就是信号和槽的机制.所有的Qt程序一定会使用这个机制!

下面我们可以先看一个简单的小程序,一个类似于图片加载器的小程序.

以下是先用Qt设计师简单拖拽出来的一个没有经过布局的图片:

这里写图片描述

我拖拽了一个QLabel框,两个QPushButton,并且给他们改过了对象名.


以下是picture.cpp中的代码:我会一行一行的解释.

#include "picture.h"

picture::picture(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    initSeaList();
    initCliffList();
    ui.label->setScaledContents(true);
    this->setWindowTitle(QString::fromLocal8Bit("图片游览"));
    connect(ui.seaButton, SIGNAL(clicked()), this, SLOT(showSeaPictureSlot()));
    connect(ui.cliffButton, SIGNAL(clicked()), this, SLOT(showCliffPictureSlot()));
}

picture::~picture()
{

}
void picture::showSeaPictureSlot()
{
    ui.label->setPixmap(QPixmap(seaList[seaNumber % 10]));
    seaNumber++;
}
void picture::initSeaList()
{
    for (int i = 0; i < 10; ++i)
    {
        QString path = "Pixmap/sea/" + QString::number(i) + ".jpg";
        seaList.push_back(path);
    }
}
void picture::showCliffPictureSlot()
{
    ui.label->setPixmap(QPixmap(cliffList[cliffNumber % 10]));
    cliffNumber++;
}
void picture::initCliffList()
{
    for (int i = 0; i < 10; ++i)
    {
        QString path = "Pixmap/cliff/" + QString::number(i) + ".jpg";
        cliffList.push_back(path);
    }
}

第1行:包含了”picture.h”文件,不用多解释吧.
第6行:picure的构造函数中,ui.setupUi(this);用来调用Qt设计师中通过拖拽而形成的页面.
第7.8行:对于两个StringList的初始化,也就是把图片的相对路径放到容器中,方便以后调用.
第9行:ui.label->setScaledContents(true);这个成员函数的作用是把label框中的东西进行填充,举个例子,如果里面放了张图片,但是图片的大小比label框要小,那么label框中就会有一些多余的空白,显得很难看,而调用了这个函数之后,就可以让图片填充满这个label框.
第10行:this->setWindowTitle(QString::fromLocal8Bit(“图片游览”));首先通过this指针来设置当前的标题为”图片游览”,但是由于Qt的编码问题,显示中文的话就会乱码,所以有了fromLocal8Bit()这个函数,它是静态的,所以可以直接用QString这个类名来调用它.
第11.12行:通过调用QObject::connect().这个连接函数,来吧QPushButton和Label连接起来,QPushButton如果被单击了,就会发出clicked()信号,所以会调用一个我们自定义的showSeaPictureSlot函数,这就体现了信号与槽的机制.等于把两个部件连接了起来,搭上了一层关系.

initSeaList函数中:首先我把10张图片放在了文件夹里,然后放在了Pixmap文件中这里是我对于10张图片的命名.
这里写图片描述


然后把Pixmap文件放在了这里:
这里写图片描述
特别注意,要想在程序中调用外部图片或者电影资源的话,最好和qrc文件放在一起.这样可以便于查找路径.(小编用的VS2013+Qt5.2版本,如果不会搭建这个环境的话,可以看我第一个帖子.)


initSeaList()函数中:QString类似于STL中的string,可以直接进行字符串相加,而资源文件的路径是从qrc文件开始的.所以QString path = “Pixmap/sea/” + QString::number(i) + “.jpg”;,QString::number()也是QString的一个静态函数,可以把数字转化为字符串,十分的方便.
然后调用seaList.push_back(path);把图片的路径放进去就行了.

showCliffPictureSlot()函数中:label->setPixmap(QPixmap())),这个函数是在label框中设置一个图片的,并且QStringList类似于STL中的vector.所以它也是重载了[]的,可以直接调用.用cliffNumber保存上一次的序号,可以方便游览下一张,而cliffNumber%10的作用是:避免访问的序号超过容器的大小.类似于以前的循环队列的做法.

以下是picture.h的代码:

#ifndef PICTURE_H
#define PICTURE_H

#include <QtWidgets/QWidget>
#include "ui_picture.h"
#include <QLabel>
#include <QPushButton>
#include <QPixmap>

class picture : public QWidget
{
    Q_OBJECT

private slots:
    void showSeaPictureSlot();
    void showCliffPictureSlot();

public:
    picture(QWidget *parent = 0);
    ~picture();
    void initSeaList();
    void initCliffList();

private:
    Ui::pictureClass ui;
    int seaNumber = 0;
    int cliffNumber = 0;
    QStringList seaList;
    QStringList cliffList;
};
#endif // PICTURE_H

这里是运行编译后的展示.
这里写图片描述


总结:
Q_OBJECT宏有着连接信号与宏的功能,一旦类中没有这个宏定义的话,信号与槽的关联也就消失了,有兴趣的小伙伴们可以做个测试,你把这个宏给注释掉,你就会发现程序一样可以正常编译通过,且成功运行,但是我点击按钮后,图片是不会显示的,原因就是缺少这个宏!

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

Qt 类中Q_OBJECT的作用及其程序代码体现 的相关文章

  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • 我的 QSqlQueryModel 不在列表视图中显示数据

    我正在玩 QSqlQueryModel 但我现在完全陷入困境 我一整天都在寻找解决方案 但到目前为止还没有运气 我所做的工作是它从我的 sqlite 数据库中提取数据 但由于某种原因我无法在列表视图中显示它 我的角色名似乎不存在 对于我从数
  • 在python中访问超级(父)类变量

    我是Python新手 我尝试使用 super 方法访问子类中的父类变量 但它抛出错误 无参数 使用类名访问类变量是可行的 但我想知道是否可以使用 super 方法访问它们 class Parent object props a str a
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 为什么可以从 console.log 访问 JavaScript 私有方法

    我写了一个简单的代码 const secure new class privateProperty 4 privateMethod console log The property this privateProperty should n
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • 从模板类创建对象时出错

    我一直在尝试找到一种方法 从 C 中的多元正态分布中采样随机向量 同时具有均值向量和协方差矩阵 就像 Matlab 的那样mvnrnd功能有效 我找到了实现此功能的类的相关代码这一页 http lost found wandering bl
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不

随机推荐

  • vant UI 轮播组件swiper 滑动时触发click点击事件

    问题描述 如图 我是用轮播图做了一个答题卡分页 但是 出现了 滑动轮播图时自动触发了数字点击的事件 解决办法 1 在van swipe标签添加 lazy render属性 实现图片懒加载 懒加载模式下 只会渲染当前页和下一页 2 在van
  • 计算机专有名词解释

    一 NMAP 二 DAS 三 NAS 四 SAN 五 FC 1 FC AE协议集 2 FC AV ARINC818 3 光纤总线特点 六 MEMERY 七 LVM 八 SCSI 特点 九 SMB 十 stordge 十一 NFS 十二 bl
  • source insight 无法查找与跳转和恢复默认设置

    1 无法搜索到工程里的文件 可能原因 下级目录没有添加 解决方法 Recursively add lower sub directories 勾选上 2 context window 不能跳转 可能原因 没有同步代码 解决方法 同步工程代码
  • Jira入门教程 敏捷开发管理(一)

    https www jianshu com p 145b5c33f7d0 简介 Jira是Atlassian公司出品的一款事务管理软件 无论是 需求 还是 BUG 或是 任务 都是 事务 的一种 所以Jira可以胜任非常多的角色 需求管理
  • https 状态码

    HTTP状态码 类别 原因短语 1 Information 信息性状态码 接受的请求正在处理 2 Success 成功状态码 请求正常处理完毕 3 Redirection 重定向状态码 需要进行附加操作已完成请求 4 Client Erro
  • 基于CentOS7.9安装部署docker(简洁版)

    安装部署 1基于官方脚本安装 不推荐 不能自行选择版本 官方文档 https docs docker com engine install centos 2 使用yum安装 阿里云文档 docker ce镜像 docker ce下载地址 d
  • The 19th Zhejiang Provincial Collegiate Programming Contest(部分题解)

    在完成三道签到之后 分别对图论 前缀 二分 大模拟上面取得突破点 但其他题集没能得到突破 仍需多加练习 A JB热爱数学 题意 给定两个数 a b 求出让a变成b的最少次数 能修改a的值为加上一个奇数 和 减去一个偶数 类型 思维题 分析各
  • vscode ssh远程输入密码之后无反应,一直提示输入密码

    用vscode进行远程服务器连接时 一直要输入密码 不断重复 始终无法链接 参考 https blog csdn net qq 33854260 article details 111255004 方法 点击view下的 command p
  • js网页模拟野火燃烧蔓延效果

    野火通过燃床蔓延是自然界的一个复杂现象 本文综述了为认识这一现象所作的研究工作 包括分析各种理化机制及通过基本物理规律构造数学模型 现有的数学模型可分为统计模型 经验模型和物理模型三类 本文着重以统一的观点评述了近五十年来所建立的各种物理模
  • 上传文件时候的accept限制文件类型.jpg、.gif、jpeg、.png、.doc、.docx、.txt、.xls、.xlsx等

    常用的 jpg image jpeg gif image gif jpeg image jpeg png image png doc application msword docx application vnd openxmlformat
  • node nginx mysql在linux的安装

    系统环境使用的阿里云ECS的CentOS 8 5 64位 nginx的安装 打开Terminal 输入以下命令安装Nginx yum install nginx 输入以下命令启动Nginx nginx 安装完成后 输入以下命令将Nginx加
  • 微信的OAuth2.0的接口配置信息修改部署Nginx

    1 新建springboot项目 package com cn wx import java io PrintWriter import java util Enumeration import javax servlet http Htt
  • 算法第三期——二分法(Python)

    目录 1 二分法 1 1 引导 猜数游戏 1 1 1 猜数游戏代码 1 2 二分法的使用条件 1 3 二分法的复杂度 2 整数二分 2 1 在单调递增序列中查找x或者x的后继 求中间值的方法 代码演示 记忆 2 2 在单调递增序列中查找x或
  • Ubuntu18.04必要安装的软件

    1 更新源 找到Software Updates 将源更新为阿里云的源 在Other Software里将Canonical Partners勾上 然后自己手动更新一下 sudo apt update sudo apt upgrade 2
  • STLINK,ST-LINK Utility无法连接单片机

    STLINK ST LINK Utility无法连接单片机 keil ST LINK Utility尝试连接最小系统板 但是无法连接 网上搜了很多教程 偶然看到一位道友说他连接空板子可以 有程序的不行 不知道为什么 因为我的板子之前也下载过
  • 中断INT 0x80的作用[转自csdn blog]

    当进程执行系统调用时 先调用系统调用库中定义某个函数 该函数通常被展开成前面提到的 syscallN的形式通过INT 0x80来陷入核心 其参数也将被通过寄存器传往核心 在这一部分 我们将介绍INT 0x80的处理函数system call
  • Python 计算机视觉

    Python 计算机视觉 from PIL import Image Image是PIL中比较重要的一个 模块 im Image open F Desktop 今日须看 代码 Python master back image bmp ims
  • python画散点图、折线图

    Python 画图 散点图scatter 保存savefig 及颜色大全 python中的散点图还可以这么画 这个针对改变描点形状 一 散点图 import numpy as np import matplotlib pyplot as p
  • MySQL之锁的使用

    MySQL表级锁的锁模式 MySQL的表级锁有两种模式 表共享读锁 Table Read Lock 和表独占写锁 Table Write Lock 锁模式的兼容性 对MyISAM表的读操作 不会阻塞其他用户对同一表的读请求 但会阻塞对同一表
  • Qt 类中Q_OBJECT的作用及其程序代码体现

    Qt中类里为什么要加上Q OBJECT这个东西呢 原来这是一个Qt定义的宏 它的作用是什么呢 原来这个宏中包含了Qt中最重要的一个机制 也就是信号和槽的机制 所有的Qt程序一定会使用这个机制 下面我们可以先看一个简单的小程序 一个类似于图片