Qt学习(2)

1.QObject

只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。

示例:

#include <QMainWindow>
#include <QString>
class A:public QObject{
public:A(QObject* parent=NULL):QObject(parent){qInfo()<<this<<"被构造";};~A(){qInfo()<<this<<"被销毁";};
};
int main(int argc, char* argv[]){A objA;A* pA2=new A(&objA);  //将pA2挂在到objA下A* pA3 = new A(pA2);objA.dumpObjectTree();
}

这样子就会形成一个树结构。

QObject:: A
    QObject:: pA2
        QObject:: pA3

2.事件与信号

GUI应用程序都由事件驱动,事件主要由应用程序的用户生成,例如点击按钮,控件。或者由其他接触发生如:Internet连接,窗口管理器或计时器。当调用exec方法时,应用程序进入主循环。主循环将获取事件并发送到对象。

信号与槽 

信号和槽用于对象之间的通信。

//signal1调用到obj2的slot1
connect(Object1,signal1,Object2,slot1);//signal1调用到obj3的slot1
connect(Object1,signal1,Object3,slot1);

 slot是普通的C++函数,当与之相连的信号发出时将调用。

连接信号和插槽的方式:

1.成员函数指针

connect(senderPtr,&QObject::destoryed,this,&MyObject::objectDestroyed);

2.仿函数或lambda表达式作为slot

connect(sender,&QObject::destoryed,this,[=](){this->m_object.remove(sender);}); 

学习示例:

头文件

#ifndef MYHEAD1_H_
#define MYHEAD1_H_
#include <QCoreApplication>
#include <QDebug>
class Sender : public QObject
{Q_OBJECT
public:explicit Sender(QObject* parent = nullptr);private:int m_age = 10;public:void incAge();
signals:// 信号函数无需定义,只需声明,并且不能有返回参数,但可以有输入参数void ageChanged(int value);
};class Receiver : public QObject
{Q_OBJECT
public:explicit Receiver(QObject* parent = nullptr);
public slots://槽函数为普通函数,需要定义,但也不能有返回值void ageChange(int age);
};
#endif  // MYHEAD1_H_

在main函数中调用:

#include "myhead1.h"
int main(int argc, char* argv[])
{Sender senderObj;senderObj.incAge();Receiver recriverObj;//传递信号,通过指针的方式传递QObject::connect(&senderObj,&Sender::ageChanged,&recriverObj,&Receiver::ageChange);//建立连接后,每次emit发送信号都会传递给reciver然后调用ageChangesenderObj.incAge();senderObj.incAge();//断开连接         QObject::disconnect(&senderObj,&Sender::ageChanged,&recriverObj,&Receiver::ageChange);senderObj.incAge();return 0;
}

当建立连接后,每次emit发送信号后,都会执行相应的槽(slots),而段凯连接后则不会继续调用槽。

3.鼠标键盘响应

  在MainWindow构造函数中注册事件,在触发时让其发出信号调用对应处理槽.

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();// QWidget interface
protected:void keyPressEvent(QKeyEvent *event);void mouseMoveEvent(QMouseEvent *event);
};
#endif // MAINWINDOW_H

实现文件

#include "mainwindow.h"#include <QtWidgets>
MainWindow::MainWindow(QWidget* parent): QMainWindow(parent)
{// 开启鼠标跟踪setMouseTracking(true);// 创建一个按钮对象,入参为按钮显示名字和操作对象auto* quitBtn = new QPushButton("Quit", this);// 设置按钮位置和大小quitBtn->setGeometry(50, 25, 100, 50);// 创建连接,当按钮点击事件出发时,调用循环的退出函数connect(quitBtn, &QPushButton::clicked, qApp, &QApplication::quit);
}MainWindow::~MainWindow()
{
}void MainWindow::keyPressEvent(QKeyEvent* event)
{// 如果当前按键事件是esc键,则退出程序if (event->key() == Qt::Key_Escape)qApp->quit();
}void MainWindow::mouseMoveEvent(QMouseEvent* event)
{// 获取当前鼠标X坐标int x = event->pos().x();// 获取y坐标int y = event->pos().y();QString text = "坐标:" + QString::number(x) + "," + QString::number(y);this->statusBar()->showMessage(text);
}

在其中,使用new QPushButton创建了一个按钮,并且在按钮中显示了文字,同时使用按钮中的方法来指定按钮的位置和大小(按照x,y轴来判断位置和创建按钮大小的).最后通过指针绑定按钮的点击事件,当按钮被按下时触发QPushButton::clicked,然后调用槽QApplication::quit用来退出程序。

其余的键盘检测按键和鼠标位置是通过重写QMainWindow类中的抽象函数来实现,当在窗口中检测到时会自动的进行调用.

4.控件与自定义槽

QWidget是用户界面的原子类。它接收鼠标、键盘和来自系统的其他事件,并在屏幕上将它们绘制出来。每个Widget都是矩形的,并按照Z-order(Z轴)进行排序。一个Widget夹在它的Parent和它前面的Widget之间。

没有嵌入parent widget中的Widget称为Window。通常情况下,Windows有一个Frame和标题栏(当然也可以通过window flags来取消这些项)。Qt中,QMainWindow和QDialog的多种多样的子类是最常见的Window类型.


 

这就是一个定义好的QMainWindow,其布局已经是默认规定好的,无法再去增加布局,但是可以创建布局然后替换对应的布局,并放入组件。

头文件:

#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_
#include <QMainWindow>
class QPushButton;
class QLabel;
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget* parent = nullptr);~MainWindow();private:QPushButton* clickBtn;QLabel* label;// QObject interface
protected:void timerEvent(QTimerEvent *event);public slots:void onClick();void onCheck(int state);
};
#endif  // MAINWINDOW_H

实现文件:

#include "mainwindow.h"#include <QtWidgets>
MainWindow::MainWindow(QWidget* parent): QMainWindow(parent){// 创建一个布局QWidget* myWidget = new QWidget(this);// 替换到中心布局中setCentralWidget(myWidget);// 创建按钮clickBtn = new QPushButton("点击", myWidget);// 创建点击事件QCheckBox* cb = new QCheckBox("Connect", myWidget);// 设置点击事件默认状态cb->setCheckState(Qt::Checked);label = new QLabel(QTime::currentTime().toString(), myWidget);//横向的展示组件QHBoxLayout* hbox = new QHBoxLayout(myWidget);hbox->addWidget(clickBtn);hbox->addWidget(cb);hbox->addWidget(label);startTimer(1000);// 以指针的方式传入对象和函数connect(clickBtn, &QPushButton::clicked, this, &MainWindow::onClick);connect(cb, &QCheckBox::stateChanged, this, &MainWindow::onCheck);
}MainWindow::~MainWindow()
{
}void MainWindow::timerEvent(QTimerEvent* event)
{// 标识这个形参没有用到Q_UNUSED(event);label->setText(QTime::currentTime().toString());
}void MainWindow::onClick()
{// 在底部标题栏展示信息statusBar()->showMessage("按钮被点击");
}void MainWindow::onCheck(int state)
{statusBar()->showMessage("");// 根据QCheckBox状态来执行对应函数if (state == Qt::Checked)connect(clickBtn, &QPushButton::clicked, this, &MainWindow::onClick);elsedisconnect(clickBtn, &QPushButton::clicked, this, &MainWindow::onClick);
}

 从这个程序中,我们可以将组件装入到我们自己创建的widget布局中,然后将该布局设置为中心布局,这样就可以在中心区域展示组件了,同时创建了自定义的槽,当触发相应事件的时候调用了自定义槽进行响应。同时也可以根据信号的实时状态来进行连接和断开。

 

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

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

相关文章

【Java 进阶篇】Jedis 操作 String:Redis中的基础数据类型

在Redis中&#xff0c;String是最基础的数据类型之一&#xff0c;而Jedis作为Java开发者与Redis交互的利器&#xff0c;提供了丰富的API来操作String。本文将深入介绍Jedis如何操作Redis中的String类型数据&#xff0c;通过生动的代码示例和详细的解释&#xff0c;让你轻松掌握…

数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!

目录 一 实现方法 二 涉及的OpenCV函数 三 代码 四 效果图 一 实现方法 ①利用OTSU方法将前景与背景分割。 ②使用连通区域分析可以将具有相同像素值且位置相邻的前景像素点组成的图像区域识别。 ③画bbox。 ④显示结果。 二 涉及的OpenCV函数 ① OpenCV提供了cv2.th…

convertRect:toView 方法注意事项

这是在网上找到的一张图 我们开发中有时候会用到左边转换&#xff0c;convertRect:toView 通常情况下&#xff0c;我们回这样使用 CGRect newRect [a convertRect:originframe toView:c];其中newRect和 originframe的size相同&#xff0c;只改变origin newRect.origin a…

系统优化软件Bitsum Process Lasso Pro v12.4,供大家学习研究参考

1、自动或手动调整进程优先级;将不需要抑制的进程添加到排除列表; 2、设置动态提升前台运行的进程/线程的优先级 3、设置进程黑名单,禁止无用进程(机制为启动即结束,而非拦截其启动)。 4、优化I/O优先级以及电源模式自动化。 5、ProBalance功能。翻译成中文是“进程平衡…

STM32入门--CAN

目录 一、bxCan简介 二、bxCAN总体描述 2.1概述 2.2CAN框图 三、bxCA的工作模式 3.1初始化模式 3.2正常模式 3.3睡眠模式&#xff08;低功耗&#xff09; 四、测试模式 4.1静默模式 4.2环回模式 五、bxCAN功能描述 5.1 发送处理 ​编辑 5.2接收管理 5.2.1 标识符过…

HTTP协议抓包工具Charles 抓包图文完整教程

Charles是在您自己的计算机上运行的Web代理&#xff08;HTTP代理 / HTTP监视器&#xff09;&#xff0c;您的网络浏览器&#xff08;或任何其他Internet应用程序&#xff09;配置为通过Charles访问Internet&#xff0c;Charles可以为您记录并显示发送和接收的所有数据。 Http抓…

Centos8部署MySQL主从复制报错问题

问题1.在部署MySQL主从复制时&#xff0c;创建用户提示ERROR 1819&#xff1a;Your password does not satisfy the current policy requirements。即为当前配置的密码&#xff0c;不符合策略要求。 问题1解决方式&#xff1a; set global validate_password.policyLOW; \\…

Leetcode—1410.HTML实体解析器【中等】

2023每日刷题&#xff08;三十八&#xff09; Leetcode—1410.HTML实体解析器 算法思想 实现代码 typedef struct entityChar {char* entity;char rechar; }entity;entity matches[] {{"&quot;", "},{"&apos;", \},{"&amp;"…

NLP中 大语言模型LLM中的思维链 Chain-of-Thought(CoT) GoT

文章目录 介绍思路CoT方法Few-shot CoTCoT Prompt设计CoT投票式CoT-自洽性&#xff08;Self-consistency&#xff09;使用复杂的CoT自动构建CoTCoT中示例顺序的影响Zero-shot CoT 零样本思维链 GoT,Graph of Thoughts总结 介绍 在过去几年的探索中&#xff0c;业界发现了一个现…

C语言之strstr函数的使用和模拟实现

C语言之strstr函数的模拟实现 文章目录 C语言之strstr函数的模拟实现1. strstr函数的介绍2. strstr函数的使用3. strstr的模拟实现3.1 实现思路3.2 实现代码 1. strstr函数的介绍 函数声明如下&#xff1a; char * strstr ( const char * str1, const char * str2 ); strs…

怎样自动把网页截图发到微信群里

现在很多公司都在使用企业微信了&#xff0c;不但方便公司内部交流和客户交流&#xff0c;还能组建各种小组群&#xff0c;业务群。企业微信群提供一个机器人的功能&#xff0c;方便我们把公司业务信息&#xff0c;或来自外部的信息自动发布到群里。 这里研究一下如何向微信群…

Maxwell安装部署消费到kafka集群

1.上传安装包到linux系统上面 2.解压安装包到安装目录下&#xff0c;并且重命名 [rootVM-4-10-centos package]# tar -zxvf maxwell-1.29.2.tar.gz -C /opt/software/3.配置mysql 增加以下配置 #数据库id server-id 1 #启动binlog&#xff0c;该参数的值会作为binlog的文件…

分布式锁详解

文章目录 分布式锁1. [传统锁回顾](https://blog.csdn.net/qq_45525848/article/details/134608044?csdn_share_tail%7B%22type%22:%22blog%22,%22rType%22:%22article%22,%22rId%22:%22134608044%22,%22source%22:%22qq_45525848%22%7D)1.1. 从减库存聊起1.2. 环境准备1.3. 简…

98、Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

简介 github 利用预训练的2D文本到图像模型来合成来自不同姿势的一系列图像。为了将这些输出提升为一致的3D场景表示&#xff0c;将单目深度估计与文本条件下的绘画模型结合起来&#xff0c;提出了一个连续的对齐策略&#xff0c;迭代地融合场景帧与现有的几何形状&#xff0…

nginx国密ssl测试

文章目录 文件准备编译部署nginx申请国密数字证书配置证书并测试 文件准备 下载文件并上传到服务器&#xff0c;这里使用centos 7.8 本文涉及的程序文件已打包可以直接下载。 点击下载 下载国密版openssl https://www.gmssl.cn/gmssl/index.jsp 下载稳定版nginx http://n…

9.9 Windows驱动开发:内核远程线程实现DLL注入

在笔者上一篇文章《内核RIP劫持实现DLL注入》介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的&#xff0c;本章将继续探索全新的注入方式&#xff0c;通过NtCreateThreadEx这个内核函数实现注入DLL的目的&#xff0c;需要注意的是该函数在微软系统中未被导出使用时需要首…

用XMind2TestCase,测试更轻松

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

数据库-MySQL之数据库必知必会10-13章

第10章 创建计算字段 拼接字段 使用Concat()函数 执行算术计算 示例&#xff1a;从 Products 表中返回 prod_id、prod_price 和 sale_price。sale_price 是一个包含促销价格的计算字段。提示&#xff1a;可以乘以 0.9&#xff0c;得到原价的 90%&#xff08;即 10%的折扣&…

2023.11.24 海豚调度,postgres库使用

目录 海豚调度架构dolphinscheduler DAG(Directed Acyclic Graph)&#xff0c; 个人自用启动服务 DS的架构(海豚调度) 海豚调度架构dolphinscheduler 注:需要先开启zookeeper服务,才能进行以下操作 通过UI进行工作流的配置操作, 配置完成后, 将其提交执行, 此时执行请求会被…

数组基础知识

数组基础&#xff08;不定时更新&#xff09; 数组基础 数组基础 &#xff08;1&#xff09;数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。数组下标都是从0开始的。数组内存空间的地址是连续的。 &#xff08;…