QT基本操作(简易教程)

article/2025/10/8 21:21:47

QT 是一个跨平台的C++图形用户界面应用程序框架

这篇文章能教会你简单的使用QT。
1.初步了解
2.进一步了解
3.信号和槽
4.实现两个窗口的连接

1.初步了解:

创建项目:
在这里插入图片描述
(Widgets是部件的意思)Widgets Application 部件应用程序
在这里插入图片描述
(文件路径不能存在中文)
在这里插入图片描述
在这里插入图片描述

基类:
MainWindow 主要用于PC端(windows,带菜单栏)
QWidget 控件的基类
QDialog 对话框

了解一下:
父类 || 子类
基类 || 派生类

会生成一个 class MyWidget : public QWidget (MyWidget继承窗口基类QWidget)

接着下一步,完成

在这里插入图片描述
编译运行的方法:
图中的箭头。
快捷键: ctrl+r
在这里插入图片描述

.pro为项目文件


#-------------------------------------------------
#
# Project created by QtCreator 2019-06-04T18:33:58
#
#-------------------------------------------------#模块,找模块,头文件按F1
QT       += core gui#为了兼容QT4以前的版本
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets#应用程序的名字
TARGET = day_011
#指定makefile的类型,app,不用管
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0//源文件 .cpp文件
SOURCES += \main.cpp \mywidget.cpp
//头文件 .h文件
HEADERS += \mywidget.h

右键点击.pro文件→在Explorer中显示
在这里插入图片描述
自动生成build…

.h头文件

会生成类MyWidget

#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>class MyWidget : public QWidget //光标对着QWidget,按F1跳到官方对应的文档
{Q_OBJECT //构造的函数,按F4可以看到对应的.cpp是空的//信号与槽的时候需要public:MyWidget(QWidget *parent = 0);~MyWidget();
};#endif // MYWIDGET_H

main.cpp 主函数

#include "mywidget.h"
//QApplication应用程序类
#include <QApplication>int main(int argc, char *argv[])
{//有且只有一个应用程序类的对象QApplication a(argc, argv);//MyWidget继承于QWidget,QWidget是一个窗口基类//所以MyWidget也是一个窗口类//w就是一个窗口MyWidget w;//窗口默认是隐藏的,要显示出来w.show();//等于a.exec();return 0;//作用让程序一直执行,等待用户操作//等待事件发生return a.exec();
}主要框架:
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);//我们写的代码return a.exec();
}

QT头文件的特点:

Qt头文件没有.h
头文件和类名一样
前两个要大写

QT的模块:

在这里插入图片描述

2.进一步了解:

创建空项目:
在这里插入图片描述
只生成一个项目文件(空的)
在这里插入图片描述
添加新文件
在这里插入图片描述
名字main.cpp

#include <QApplication>
#include <QWidget> //窗口控件基类
#include <QPushButton>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget w;w.setWindowTitle(QString("标题")); //设置标题/*如果不指定父对象,对象和对象(窗口和窗口)没有关系,独立* a指定b为它的父对象,a放在b的上面* 指定父对象,有2种方式:*       1)setParent*       2)通过构造函数传参* 指定父对象,只需要父对象显示,上面的子对象自动显示*/QPushButton b;b.setText("-_-"); //给按键设置内容b.setParent(&w); //指定父对象b.move(100,100); //移动坐标QPushButton b1(&w);b1.setText("abc");w.show();return app.exec();
}

运行结果如图:
在这里插入图片描述
在这里插入图片描述
这个可以改编译环境。

3.信号和槽

创建一个新的项目:
main.cpp不改变它

#include "mainwidget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);  //会执行到这句话MainWidget w;  //执行MainWidget的构造函数,所以我们的main.cpp永远不用改w.show();return a.exec();  
}

点击工具→选项
在这里插入图片描述
用UTF-8

mainWidget.h文件:

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPushButton>class MainWidget : public QWidget
{Q_OBJECTpublic:MainWidget(QWidget *parent = 0);~MainWidget();private:  //加上了这个QPushButton b1;QPushButton *b2;
};#endif // MAINWIDGET_H

来到mainWidget.cpp

#include "mainwidget.h"
#include <QPushButton>MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{b1.setParent(this); //添加按键b1b1.setText("-_-");b1.move(100,100);b2 = new QPushButton(this); //指针要开内存,添加按键b2b2->setText("---");
}MainWidget::~MainWidget()
{}

下面,我们开始为按钮设置功能:

重点:信号和槽

查看库函数
将光标指向头文件QPushButton,按两下F1

在这里插入图片描述
点基类 QAbstractButton
在这里插入图片描述
在这里插入图片描述
点了有对信号的描述。

按esc退出。

在上面的mainWidget.cpp文件中加上connect(&b1, &QPushButton:: pressed, this, &MainWidget:: close);
即可实现按下关闭窗口。
光标移到close按F1
在这里插入图片描述
[slot] 代表槽

来看个例子:
首先,.h文件

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPushButton>class MainWidget : public QWidget
{Q_OBJECTpublic:MainWidget(QWidget *parent = 0);~MainWidget();void mySlot();//加了个定义函数
private:QPushButton b1;  //定义变量QPushButton *b2;  //定义变量
};#endif // MAINWIDGET_H

main.cpp文件不变
mainWidget.cpp文件

#include "mainwidget.h"
#include <QPushButton>//按F1.再按F1MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{b1.setParent(this);b1.setText("close");b1.move(100,100);b2 = new QPushButton(this);b2->setText("---");connect(&b1, &QPushButton:: pressed, this, &MainWidget:: close);/* &b1:信号发出者,指针类型* &QPushButton:: pressed:处理的信号, &发送者的类名::信号名字* this:信号接收者* &MainWidget:: close: 槽函数,信号处理函数,&接收者类名::槽函数名字*//*自定义槽* Qt5任意的成员函数,普通全局函数,静态函数* 槽函数需要和信号一致(参数,返回值)* 由于信号都是没有返回值,所以,槽函数一定没有返回值*///按下b2时,b2内容变成123connect(b2, &QPushButton::released, this, &MainWidget::mySlot);//松开b2时,b1消失connect(b2, &QPushButton::released, &b1, &QPushButton::hide);/*信号,短信* 槽函数,接受短信的手机*/
}void MainWidget::mySlot(){  //自定义函数b2->setText("123");
}MainWidget::~MainWidget()
{}

结果:
在这里插入图片描述
按一下:
在这里插入图片描述

4.实现两个窗口的连接

新建窗口:选中项目文件夹,右击,添加新文件,c++,c++ Class,
在这里插入图片描述
文件夹就变成这样
在这里插入图片描述
这里有时候会爆出mainwidget.obj? error: LNK2019: 无法解析的外部符号 "public: __cdecl SubWidget::SubWidget(class QWidget *)…这样的错误,这时候就要将build文件删除,重新编译。

mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPushButton>
#include "subwidget.h"//子窗口头文件class MainWidget : public QWidget
{Q_OBJECTpublic:MainWidget(QWidget *parent = 0);~MainWidget();//void mySlot();void changeWin();void dealsub();void dealSlot(int,QString);  
private:QPushButton b3;SubWidget subwin;//对象
};#endif // MAINWIDGET_H
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 sendSlot();
signals:/*信号必须有signals关键字来声明* 信号没有返回值,但可以有参数* 信号就是函数的声明,只需声明,无需定义*/void mySignal();void mySignal(int ,QString);public slots:private:QPushButton b;
};#endif // SUBWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
#include <QPushButton>//按F1.再按F1
#include <QDebug>  //打印MainWidget::MainWidget(QWidget *parent): QWidget(parent)
{setWindowTitle("boss");//等于this->setWindowTitle("boss");b3.setParent(this);b3.setText("切换到子窗口");b3.move(50,50);//显示子窗口//w.show();connect(&b3, &QPushButton::released, this, &MainWidget::changeWin);//处理子窗口的信号void(SubWidget::*funSignal)()=&SubWidget::mySignal;  //函数指针connect(&subwin,funSignal, this, &MainWidget::dealsub);void(SubWidget::*testSignal)(int, QString)=&SubWidget::mySignal; //函数指针connect(&subwin,testSignal, this, &MainWidget::dealSlot);//让窗口大小不变resize(400, 300);
}void MainWidget::dealSlot(int a,QString str){//str.toUtf8 -> 字节数组 QByteArray// ...data() -> QByteArray()qDebug() << a << str.toUtf8().Data();
}void MainWidget::changeWin(){//子窗口显示subwin.show();//本窗口隐藏this->hide();
}void MainWidget::dealsub(){//子窗口显示subwin.hide();//本窗口隐藏this->show();
}MainWidget::~MainWidget()
{}
subwidget.cpp
#include "subwidget.h"SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{this->setWindowTitle("小弟");b.setParent(this);b.setText("切换到主窗口");b.move(50,50);connect(&b, &QPushButton::clicked, this, &SubWidget::sendSlot);//让窗口大小不变resize(400, 300);
}void SubWidget::sendSlot(){emit mySignal();emit mySignal(250,"hello");  //重载的信息
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主要步骤:
1.创建c++类文件。
2.主窗口切换到子窗口
1)在主窗口.h中声明一个按键
2)在主窗口.cpp中创建一个按键,按键连接this
3)在主窗口.h中声明一个函数,
4)在主窗口.cpp中自定义函数
3.子窗口切换到主窗口
1)在子窗口.h中声明一个按键
2)在子窗口.cpp中创建一个按键,按键连接this
3)在子窗口.h中声明一个函数,
4)在子窗口.cpp中自定义函数
5)把子窗口的.h 包含进主窗口.h中
6)在主窗口,h建立一个接收信号的函数和一个对象
7)在主窗口.cpp中写一个接收子窗口信号的连接(子窗口连接主窗口)
8)在主窗口.cpp中写一个接收子窗口信号后的函数

(按F4能切换头文件和cpp文件)

函数指针

void fun(int){
}void (*p)(int) = fun;

在这里插入图片描述

如果获得了别人的代码,
在这里插入图片描述
需要把.user文件删除,(因为里面保存着路径)再编译运行


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

相关文章

Qt使用教程

1 项目背景 在完成最后一个项目的过程中&#xff0c;因为之前的定制版本是基于C#和WPF的&#xff0c;由于Qt的跨平台特性&#xff0c;而且相较于WPF简单易学&#xff0c;资料丰富&#xff0c;界面漂亮&#xff0c;尤其是能够独立安装和跨平台的特性&#xff0c;使得在项目开发…

QTP(Quick Test Professional)安装详细教程

下载链接&#xff1a; 一、QuickTest简介 QuickTest Professional简称QTP&#xff0c;是一种自动测试工具。 二、QuickTest安装 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1B11ZL_MsBXBCI4k6igJmXg 提取码&#xff1a;jwvo 本次实验版本为QTP10。 按默认…

【自动化测试工具】QTP/UFT入门

准备工作: QTP11.5安装教程:http://www.iquicktest.com/qtp-uft-11-5-download.html 注: QuickTest Pro(QTP)11.5后更名为UnifiedFunctional Testing(UFT) 1、安装后打开QTP,勾选Web add-in,进入QTP后File-New-Test。 2、选择File菜单下New-Test。 选择GUI Test,输入N…

QTP使用教程

QTP使用教程 一、QTP简介二、QTP基本功能三、QTP软件特点四、QTP使用步骤五、QTP具体操作1、安装后打开2、选择File菜单下New-Test3、打开IE&#xff0c;进入百度首页www.baidu.com4、打开QTP本地对象库5、添加对象到本地对象库6、选中wd对象7、输入参数8、拖拽“百度一下”对象…

基于Eviews的稳定性检验——以个股的β系数为例(含ADF检验步骤及结果分析)

基于Eviews的稳定性检验——以个股的β系数为例&#xff08;含ADF检验步骤及结果分析&#xff09; 数据的获取将Excel数据导入到Eviews时间序列图单位根检验与ADF检验个股的β系数稳定性检验补充 总结 在资本资产定价模型&#xff08;CAPM&#xff09;中&#xff0c;β系数也称…

单位根检验urdf_实证分析中,大家是如何进行单位根(ADF)检验的?或者ADF检验流程是什么?...

最近在跟朋友聊天中,聊到了关于在实证分析中单位根检验的使用问题,事后,进行了总结。 希望论坛里的朋友谈谈自己如何进行单位根检验分析的,以及分享一下自己的经验,供大家一起学习、讨论。 我先谈谈自己的愚见,希望大家多批评指正、说说自己在实证分析中ADF检验的经验。 …

Matlab实现ADF检验,adftest函数使用详细说明(看完就会用)

目录 ADF检验简介adftest的使用及参数介绍——简单调用&#xff1a;h adftest(y)——多参数调用&#xff1a;[h,pValue,stat,cValue] adftest(y,alpha,0.05) adftest如何判断是否平稳&#xff1f;——原假设与备择假设——通过h判断是否平稳——通过pValue判单是否平稳——通…

时间序列研(part8)--ADF检验

学习笔记&#xff0c;仅供参考&#xff0c;有错必纠 文章目录 时间序列ADF检验多重单位根的检验方法结构突变与单位根检验外生性结构突变点的检验方法内生性结构突变点的检验方法 时间序列 ADF检验 如果被检验的真实过程是一个AR 过程&#xff0c;而检验式是AR(1)形式&#xff…

时间序列分析(7)| ADF检验

上篇介绍了DF检验&#xff0c;该检验仅用于AR(1)过程的单位根检验&#xff0c;对于AR()过程来说&#xff0c;需要使用拓展DF检验&#xff08;augmented Dickey-Fuller&#xff0c;ADF&#xff09;。 1 模型检验形式 AR()过程的形式如下&#xff1a; 上式可以转换成如下形式&…

matlab实现adf检验,ADF检验MATLAB程序资料

ADF-situation1-statistic1-2.m %ADF检验法p取2. %AR(2)过程临界值的确定 T5000; N200; w1zeros(1,T); w2zeros(1,T); for t1:T sita10.7; sita20.3; rusita1sita2; labuda1-sita2; %p2; erandn(1,N); y1(1)e(1); y1(2)sita1*y1(1)e(2); for j3:N y1(j)sita1*y1(j-1)sita2*y1(j…

Python ADF检验

转自&#xff1a;https://pengfoo.com/post/machine-learning/2017-01-24 Abstract 在ARMA/ARIMA这样的自回归模型中&#xff0c;模型对时间序列数据的平稳是有要求的&#xff0c;因此&#xff0c;需要对数据或者数据的n阶差分进行平稳检验&#xff0c;而一种常见的方法就是AD…

ADF单位根检验三种形式_Eviews之ADF单位根检验

本文使用的数据是2010-01-04——2020-03-05沪深300指数的每日收盘价,走势图如下: 接下来,开始使用eviews8.0检验: 1、双击点开所要检验的时间序列数据 2、点击view,然后再选择Unit Root Test 3、检验类型选择ADF检验。检验的顺序一般是 原始数据->一阶差分->二阶差分…

时间序列分析之ADF检验

ADF检验 在使用很多时间序列模型的时候&#xff0c;如 ARMA、ARIMA&#xff0c;都会要求时间序列是平稳的&#xff0c;所以一般在研究一段时间序列的时候&#xff0c;第一步都需要进行平稳性检验&#xff0c;除了用肉眼检测的方法&#xff0c;另外比较常用的严格的统计检验方法…

ADF检验数据平稳性

目录 1 背景 2 单位根 3 单位根检验 4 ADF检验 5 python 实现与结果解释 1 背景 在使用很多时间序列模型的时候&#xff0c;如 ARMA、ARIMA&#xff0c;都会要求时间序列是平稳的&#xff0c;所以一般在研究一段时间序列的时候&#xff0c;第一步都需要进行平稳性检验&…

时间序列学习(4):平稳性检验(单位根检验、ADF检验)

时间序列学习&#xff08;4&#xff09;&#xff1a;平稳性检验&#xff08;单位根检验、ADF检验&#xff09; 1、单位根检验2、ADF检验3、指数走势的检验4、对数收益率序列检验 相关图可以大致判断序列是否平稳。但是&#xff0c;这毕竟不是严格的。 这篇笔记来就谈一谈平稳性…

Spectral clustering(谱聚类)算法的实现

目录 1.作者介绍2.关于谱聚类的介绍2.1 谱聚类概述2.2 无向权重图2.3 邻接矩阵2.4 相似矩阵2.5 度矩阵2.6 拉普拉斯矩阵2.7 K-Means 3.Spectral clustering&#xff08;谱聚类&#xff09;算法实现3.1 数据集3.2 导入所需要的包3.3 获取特征值和特征向量3.4 利用K-Means聚类3.5…

Python学习4-谱聚类

一&#xff0c;谱聚类原理 谱聚类算法原理可以参考如下链接。 这个视频推导出了拉普拉斯矩阵&#xff0c;但没有更新后续优化问题。 机器学习-白板推导系列(二十二)-谱聚类&#xff08;Spectral Clustering&#xff09;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV…

机器学习-层次聚类(谱系聚类)算法

文章目录 简介距离矩阵最短距离法最长距离法类平均法重心法python应用 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 层次聚类&#xff08;Hierarchical Clustreing&#xff09;又…

到底什么是谱聚类算法?

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自&#xff1a;视学算法 谱聚类算法是目前最流行的聚类算法之一&#xff0c;其性能及适用场景优于传统的聚类算法如k-均值算法&#xff0c;本文对谱聚类算法进行了…

图像聚类-谱聚类

最近做的一个东西跟这个相关&#xff0c;本来希望是用深度学习对于没有标签的图像数据进行分类&#xff0c;但是通常情况下&#xff0c;深度学习是对有标签的数据进行学习&#xff0c;目的是用来自动提取特征&#xff0c;代替传统的手工提取特征。因此&#xff0c;比较容易想到…