Qt自学_恶搞窗口

289 阅读2分钟

首先本人之前从未学习过c++,(大学学过c,写过最厉害的c代码就是水仙花数)

最近公司有个项目,关于检测方面的,软件是用的c++开发。

开始接触c++,顿时感觉和java还挺像,只不过里面又是 · 又是 -> 的有点让人琢磨不透。

先来说说指针

1.指针

什么是指针?

C++ 中的指针是一种特殊的变量类型,它存储了一个内存地址。指针可以用于直接访问和操作内存中的数据。

来看看基本变量和指针变量的区别?

   int  a = 5;   //开辟一个int型的内存空间,然后赋值为5。
                // 就是这个a空间,他的类型是int类型,一般为四个字节
   
   int* b = 5;  //报错。int 类型不能初始化 int* 类型
   
   int* b = &a   //开辟一个 int*型的内存空间。这个int*型就是整型数据的地址类型。
                 // 其中&符号就是获取某个空间的地址。&a就是获取a的地址数据。
                 // 以上完成之后,b存的就是a的地址。
                 
 
   cout << b << endl;   // 00AFF898 地址类型
   cout << &a << endl;  // 00AFF898 地址类型
   cout << &(*b) << endl; // 00AFF898 地址类型
    
   cout<<a<<endl;   // 5     对应地址中的数据
   cout<<*b<<endl;  // 5     对应地址中的数据
   
   *b = 6;             //  这句话是把6赋值给*b。*b就是a。也就是a=6;
   cout << a << endl;  // 6

总结来说:指针存地址,什么类型指针存什么类型变量的地址。你不能int* 去存double类型的地址。诸如种种。 注意: 为了避免混淆,最好 * 和前面在一起,因为前面的才是一个整体是类型。 比如 int* a = 5. 最好别写成 int *a = 5,因为这样你会觉得int是类型, *a是变量。hhhh~~~

2.Qt框架

我对Qt的了解,它跨平台,GUI框架,基本上就了解这么多了~~

GPT这样说的:

Qt的应用场景:

1、Qt框架是一个功能强大的跨平台应用程序开发框架,适用于各种应用场景。下面是一些常见的Qt框架应用场景:
2、桌面应用程序开发:Qt提供了丰富的GUI组件和工具,使开发者能够轻松创建各种类型的桌面应用程序,如文本编辑器、图形编辑器、音乐播放器、图像处理工具等。
3、移动应用程序开发:Qt支持开发移动应用程序,包括Android和iOS平台。开发者可以使用Qt来构建跨平台的移动应用程序,减少开发和维护的工作量。
4、嵌入式系统开发:Qt在嵌入式系统领域有广泛的应用,如智能家居控制面板、工业控制系统、医疗设备、汽车娱乐系统等。Qt的跨平台特性和丰富的功能使得开发者能够快速构建高性能、可靠的嵌入式应用程序。
5、游戏开发:Qt提供了一些游戏开发相关的模块和工具,如图形渲染、动画、物理引擎等。开发者可以使用Qt来开发2D和简单的3D游戏。
6、数据可视化和科学计算:Qt提供了一些用于数据可视化和科学计算的模块和工具,如绘图、图表、数据处理等。开发者可以使用Qt来构建数据分析、科学计算和可视化的应用程序。

Qt框架的原理主要基于以下几个核心概念:

1、信号与槽机制:Qt使用信号与槽机制来处理对象之间的通信和事件处理。通过信号与槽,对象可以在特定事件发生时发送信号,其他对象可以连接到这些信号,并在接收到信号时执行相应的槽函数。
2、对象树和父子关系:Qt中的对象可以组织成一个层次结构,形成对象树。每个对象都有一个父对象,当父对象被销毁时,它的所有子对象也会被销毁。这种父子关系使得对象的管理和内存释放更加方便。
3、事件驱动编程:Qt是基于事件驱动的编程模型。当用户与应用程序交互时,Qt会生成相应的事件,并将其发送给适当的对象进行处理。开发者可以通过重写事件处理函数来响应和处理这些事件。
4、信号槽连接:Qt使用信号槽连接来建立对象之间的通信。开发者可以使用connect函数将一个对象的信号连接到另一个对象的槽函数,实现事件的传递和处理。
5、跨平台支持:Qt提供了一套跨平台的API,使得开发者可以使用相同的代码库在不同的操作系统上运行应用程序。Qt通过封装底层操作系统的差异,提供了统一的接口和功能。

确实应用场景还挺多的~~

3.Qt做一个恶搞的小窗口

3.1 环境准备:

       1:visual Studio 2019 
 
       2:qt5.13.2
       

1、vs下载安装:下个2019版本即可,装c++开发环境。 基本就是点点点就安装好了。

2、Qt下载安装

下载地址:多版本下载地址

这里我选的5.13; 如果下的慢,搞个迅雷获取IDM来下载。

image.png

接下来我们安装Qt

一路next, 有一步需要注册邮箱登录,自己注册一个登录就行。

看自己咋选,磁盘大也可以都选~~~

image.png 然后一路next, 选择磁盘安装就行了,别放c盘,这个东西装的环境多了,少说十几个G...

3、环境变量设置

我的环境变量是这个。哎,才发现装到了C盘~~

image.png

高级系统设置里面的---环境变量---系统环境变量---path添加这个地址

C:\PCB\Qt\Qt5.13.2\5.13.2\msvc2017_64 至此:Qt安装好了,环境也配置好了。

4、在vs中配置Qt插件。

vs下载这个插件很慢,可以点击这个链接下载。 Qt tools下载 。如果浏览器下载太慢,链接复制丢到迅雷去下载。

下完之后,关闭vs2019,双击打开这个插件,直接安装了。安装好了之后再打开vs2019,你会看到

image.png

vs也能创建qt项目了

image.png 环境至此全部搞定:

image.png

4、搞怪Demo开搞

1、命名地址自己选,点击创建。

2、出现这个next

image.png

3、选择那个debug,也就是开发调试阶段。

image.png 4、这里我选的是这个QWidget,其他的还没试。

image.png

然后点击 finish完成创建 6、目前进入了项目。点击本地Windows调试

image.png

ok窗口运行了

image.png

5、Qt恶搞窗口的代码

#include "QtWidgetsApplication1.h"
#include <QDesktopWidget>
#include <iostream>
#include<qevent.h>
#include<qlabel.h>
#include<String>
using namespace std;

QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent)
	: QWidget(parent)
{
	//去掉窗体的原始,最小化,最大化,关闭等
	setWindowFlags(Qt::WindowType::FramelessWindowHint);
	ui.setupUi(this);

	number = 0;
	ui.pushButton_3->installEventFilter(this);

	// 连接信号与槽函数的代码。
//	connect(ui.pushButton_3, &QPushButton::clicked, this, &QtWidgetsApplication1::on_pushButton_3_clicked);
}

QtWidgetsApplication1::~QtWidgetsApplication1()
{


}


bool QtWidgetsApplication1::eventFilter(QObject* obj, QEvent* event)
{
	if (event->type() == QEvent::Enter) {
		if (obj == ui.pushButton_3 && number != 9) {
			// 当鼠标进入按钮时,窗口随机移动
			moveRandomly();
		}
	}

	return QWidget::eventFilter(obj, event);
}

void QtWidgetsApplication1::on_pushButton_2_clicked()
{
	this->showMaximized();
}

void QtWidgetsApplication1::on_pushButton_3_clicked()
{
	ui.label->setText(QString::fromLocal8Bit("真厉害呀!!"));
}

void QtWidgetsApplication1::moveRandomly()
{ // 获取主窗口的当前位置和大小
	  // 获取主窗口的当前位置和大小
	QRect currentGeometry = geometry();

	// 获取主屏幕的可移动范围
	QRect availableGeometry = QApplication::desktop()->availableGeometry();

	// 生成随机的窗口位置
	int x = qrand() % (availableGeometry.width() - currentGeometry.width());
	int y = qrand() % (availableGeometry.height() - currentGeometry.height());

	// 移动窗口到随机位置
	move(availableGeometry.x() + x, availableGeometry.y() + y);

	number++;

	string text[] = {
		"试试点我一下",
		"咋这么慢?",
		"就这?",
		"算了,给你点吧",

		"加油,就点到我了?",
		"菜逼,还点不到我,那我跑慢点",
		"我不动了,你点吧!!"
	};


	if (number < 7) {
		// ui.label->setText();

		const  char* now = text[number].c_str();
		ui.label->setText(QString::fromLocal8Bit(now));
	}
	if (number == 7) {
		return;
	}

}

void QtWidgetsApplication1::on_pushButton_clicked()
{
	this->showMinimized();
}

6、效果展示

image.png

image.png

image.png

image.png 。。。。。

欢迎讨论~~~