Qt:学习笔记一

 一、工程文件介绍

1.1 main.cpp 

#include "widget.h"
#include <QApplication> // 包含一个应用程序类的头文件
//argc:命令行变量的数量;argv:命令行变量的数组
int main(int argc, char *argv[])
{//a应用程序对象,在Qt中,应用程序对象有且仅有一个QApplication a(argc, argv);//窗口对象 Widget父类-》QWidgetWidget w;//窗口对象 默认不会显示,必须调用show方法显示窗口w.show();//让应用程序对象进入消息循环,代码堵塞到当前行return a.exec();
}

1.2 project1.pro

QT       += core gui  //Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本以上,包含widget模块CONFIG += c++11   //配置中多加c++11DEFINES += QT_DEPRECATED_WARNINGSbefore Qt 6.0.0SOURCES += \       //源文件main.cpp \widget.cppHEADERS += \      //头文件widget.hFORMS += \widget.ui

1.3 widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT  //Q_OBJECT宏,允许类中使用信号和槽的机制
public:Widget(QWidget *parent = nullptr); //构造函数~Widget();         //析构函数
private:Ui::Widget *ui;
};
#endif // WIDGET_H

1.4 快捷键

1.注释: ctrl + /

2.运行: ctrl + r

3.编译: ctrl + b

4.查找: ctrl + f

5.整体移动: ctrl + shift + 向上箭头 或 向下箭头

6. 帮助文档: F1

7.自动对齐: ctrl + i


二、 常用操作

2.1 文档使用

2.2 常用操作 

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建一个按钮QPushButton* btn = new QPushButton;//btn->show(); //show以顶层方式弹出窗口控件//让btn对象 依赖在Widget窗口中btn->setParent(this);//重置按钮大小btn->resize(100,100);//显示文本btn->setText("第一个按钮");//重置窗口大小resize(600,400);//设置固定窗口大小setFixedSize(400,400);//移动btn按钮btn->move(200,200);//设置窗口标题setWindowTitle("第一个窗口");
}

2.3 调用析构函数 

Qt中关闭窗口会自动调用析构,从底层一步步向上析构 

当创建的对象在堆区时候,如果指定的父亲是 Qobiect派生下来的类或者Qobject可以不用管理释放的操作,将对象会放入到对象树中

2.4 坐标系


三、信号与槽 

3.1

参数一:信号的发送者

参数二:发送的信号(函数地址)

参数三:信号的接受者

参数四:处理槽函数(函数地址)

connect(btn, &QPushButton::clicked, this, &Widget::close);

Teacher.h
//自定义信号
signals://自定义信号,写到signals下//返回值是void,只需要声明,不需要实现//可以有参数,可以重载void hungry();
Student.h
//自定义槽函数
public slots://槽函数,可以写到public slots,也可以写到public全局下//返回值void,需要声明,也需要实现//可以有参数,可以发生重载void treat();
//emit,触发自定义信号
void Widget::classIsover()
{//下课函数,调用后,触发老师饿了的信号emit zt->hungry();
}

 3.2 自定义信号和槽函数出现重载

//Student.h
public slots://槽函数,可以写到public slots,也可以写到public全局下//返回值void,需要声明,也需要实现//可以有参数,可以发生重载void treat();void treat(QString foodName);
};
//Teacher.h
signals://自定义信号,写到signals下//返回值是void,只需要声明,不需要实现//可以有参数,可以重载void hungry();void hungry(QString foodName);
};
//student.cpp
void Student::treat()
{qDebug() << "请老师吃饭";
}void Student::treat(QString foodName)
{//QString->char * 先转成QByteArray (.toUtf8() ) 再转char * ()qDebug() << "请老师吃饭,老师吃:"<<foodName.toUtf8().data();
}
//widget.cpp
//带参
//函数指针->函数地址
void (Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void (Student:: *studentSlot)(QString) = &Student::treat;
connect(zt, teacherSignal, st, studentSlot);classIsover();
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//点击新建按钮,弹出一个对话框connect(ui->actionnew, &QAction::triggered, [=](){//对话框 分类//模态对话框(不可以对其他窗口进行操作);非模态对话框(可以对其他窗口进行操作)//1.模态创建QDialog dlg(this);dlg.resize(200,100); //调整弹出的对话框大小dlg.exec();qDebug() << "模态对话框弹出了";//2.非模态对话框QDialog *dlg2 = new QDialog(this);dlg2->resize(200,100);dlg2->show();dlg2->setAttribute(Qt::WA_DeleteOnClose);qDebug() << "模态对话框弹出了";//3.错误对话框QMessageBox::critical(this,"critical","错误");//4.信息对话框QMessageBox::information(this,"info","信息");//5.提问对话框//1.父亲 2.标题 3.提示内容 4.按键类型 5.默认回车关联按键if(QMessageBox::Save==QMessageBox::question(this,"que","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))qDebug()<<"选择的是保存";elseqDebug()<<"选择的是取消";//6.警告对话框QMessageBox::warning(this,"warning","警告");//其他标准对话框//7.颜色对话框QColor qc = QColorDialog::getColor(Qt::red);QColor qc = QColorDialog::getColor(QColor(255,0,0));qDebug() << "r = "<<qc.red() <<"g = " << qc.green()<<"b = "<<qc.blue();//8.文件对话框//返回值是选取的路径QString str = QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\hp\\Desktop",".txt");qDebug() << str;//9.字体对话框bool flag;QFont f = QFontDialog::getFont(&flag, QFont("宋体"),this, "设置字体");qDebug() << "字体:"<< f.family().toUtf8().data() <<"字号:"<<f.pointSize()<<"加粗:"<<f.bold();});
}

四、控件

4.1 按钮组件

4.1.1Tool Button

1.给按钮添加图片并设置大小:icon

2.按钮背景透明:QToolButton -> autoRaise

3.图片后加文字:text + toolButtonStyle -> ToolButtonTextBesideIcon


4.1.2 Radio Button

1.分组:Containers-》Group Box

2.设置默认选择: ui->rbtnMan->setChecked(true);


4.1.3 Check Box 

  1.除用clicked,也可以用stateChangedconnect(ui->checkBox, &QCheckBox::stateChanged, [=](int state){             qDebug() << state;});

//点击输出2,取消勾选输出0

2. 半选状态:tristate

//0是未选,1是半选,2是选择


4.2 QList、QTree、QTable


4.3 其他常用控件


五、自定义控件封装

5.1 改变数字,滑动条跟着移动,反之

1.添加新文件 - Qt - 设计师界面类(.h .cpp .ui);

2. 副ui(smallwidget)中设计QSpinBox和QSlider两个控件;

3. 在主ui中添加widget,点击提升为smallwidget类;实现副窗口在主窗口出现

//valueChanged函数重载,需要用函数指针的形式
void (QSpinBox:: *ptr)(int) = &QSpinBox::valueChanged;
//数字改变,滑动条移动
connect(ui->spinBox, ptr, ui->horizontalSlider, &QSlider::setValue);
//滑动条移动,数字改变
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);

5.2 添加按钮控制

//在smallwidget.cpp中添加
//设置num,数字和滑动条跟着变化
void smallWidget::setNum(int num)
{ui->spinBox->setValue(num); //ui指副窗口
}
//获取当前数字
int smallWidget::getNum()
{return ui->spinBox->value();
}
//在mainwidget.cpp中
//此处ui是主窗口,ui->widget调用副窗口功能
connect(ui->getButton, &QPushButton::clicked, [=](){qDebug() << ui->widget->getNum();
});
//数字设置为50
connect(ui->setButton, &QPushButton::clicked, [=](){ui->widget->setNum(50);
});

六、Qt中的事件

6.1 鼠标事件

1.鼠标进事件      enterEvent(QEvent *event)

2.鼠标离开事件

3.鼠标按下     mousePressEvent(QMouseEvent *ev)

4.鼠标释放

5.鼠标移动

1.ev->x(): x坐标; ev->y(): y坐标

   ev->gloalX: 全局下x坐标; ev->gloalY: 全局下y坐标

2.ev->button(): 可以判断所有按键,Qt::LeftButton

3.ev->buttons(): 判断组合键,判断move时候的左右键,结合 & 操作符

4.格式化字符串:QString("%1  %2").arg(111).arg(222);

myLable::myLable(QWidget *parent): QLabel(parent)
{//与mouseMoveEvent进行联动setMouseTracking(true);
}
//1.鼠标进入事件
void myLable::enterEvent(QEvent *event)
{qDebug() << "鼠标进入了";
}
//2.鼠标离开事件
void myLable::leaveEvent(QEvent *event)
{qDebug() << "鼠标离开了";
}
//3.鼠标按下
void myLable::mousePressEvent(QMouseEvent *ev)
{if(ev->button() ==  Qt::LeftButton){QString str = QString("鼠标按下 x = %1, y = %2, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}
//4.鼠标释放
void myLable::mouseReleaseEvent(QMouseEvent *ev)
{if(ev->button() ==  Qt::LeftButton){qDebug() << "鼠标释放";}
}
//5.鼠标移动
//按下和释放是瞬间的,移动是一个过程
void myLable::mouseMoveEvent(QMouseEvent *ev)
{
//     if(ev->buttons() &  Qt::LeftButton) //用=,两个按键同时按下错误,用&限制左键
//     {QString str = QString("鼠标移动 x = %1, y = %2, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;
//     }
}

6.2 定时器

6.2.1 一个定时1s,一个定时2s

1.利用事件  void timerEvent(QTimerEvent *event) 进行触发

2.启动定时器  id1 = startTimer(1000); //单位毫秒,返回值作为区别定时器的标识

3.利用event->timerId()与id1进行判断

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);id1 = startTimer(1000); //单位毫秒id2 = startTimer(2000);
}void Widget::timerEvent(QTimerEvent *event)
{if(event->timerId() == id1){static int num1 = 1;ui->label_2->setText(QString::number(num1++));}else if(event->timerId() == id2){static int num2 = 1;ui->label_3->setText(QString::number(num2++));}
}

6.2.2 实现定时器的第二种方式

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//定时器的第二种启动方式QTimer* timer1 = new QTimer(this);  //this放入对象树中timer1->start(500);connect(timer1, &QTimer::timeout, [=](){static int num3 = 1;ui->label_4->setText(QString::number(num3++));});connect(ui->pushButton, &QPushButton::clicked, [=](){timer1->stop();});
}

6.3 事件分发器和事件过滤器


6.4 绘图事件

6.4.1 常用操作

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *event)
{//实例化画家对象,this指定的是绘图设备QPainter painter(this);//设置画笔QPen pen(QColor(255, 0, 0));//设置画笔宽度pen.setWidth(3);//设置画笔风格pen.setStyle(Qt::DotLine);//让画家使用这个笔painter.setPen(pen);//设置画刷QBrush brush(Qt::cyan);//设置画刷风格brush.setStyle(Qt::Dense7Pattern);//让画家使用画刷painter.setBrush(brush);//画线painter.drawLine(QPoint(0,0), QPoint(100,100));//画圆 椭圆painter.drawEllipse(QPoint(100,100),50,50);//画矩形painter.drawRect(QRect(100,100,50,50));//画文字painter.drawText(150,150,QString("好好学习"));
}

 6.4.2 高级设置

    QPainter painter(this);painter.drawEllipse(QPoint(100,50),50,50);//设置抗锯齿能力painter.setRenderHint(QPainter::Antialiasing);painter.drawEllipse(QPoint(200,50),50,50);//画矩形painter.drawRect(QRect(100,100,100,100));//移动画家painter.translate(100,0);//保持画家状态painter.save();painter.drawRect(QRect(100,100,100,100));painter.translate(100,0);//还原画家状态painter.restore();painter.drawRect(QRect(100,100,100,100));

6.4.3 定时器加手动调用绘图

    QPainter painter(this);if(this->width() < Posx )Posx = 0;painter.drawPixmap(Posx, 0, QPixmap(":/4.jpg"));//开启定时器QTimer *timer1 = new QTimer(this);timer1->start(500);//连接定时器与绘图connect(timer1, &QTimer::timeout, [=](){Posx += 20;//手动调哟个绘画事件,用update()update();});

6.4.4  QPixmap绘图设备

    //QPixmap绘图设备,专门对平台做了显示优化QPixmap pix(300, 300);//填充背景颜色pix.fill(Qt::white);//创建画家对象,&pix在创建的绘图设备上绘图QPainter painter(&pix);painter.setPen(QColor(Qt::red));painter.drawEllipse(QPoint(100, 100),50, 50);pix.save("F:\\Qt\\QtProject\\pix.jpg");

6.4.5 QImage绘图设备

     //QImage绘图设备QImage img(0,0,QImage::Format_RGB32);img.fill(Qt::white);QPainter painter(&img);painter.setPen(QColor(Qt::blue));painter.drawEllipse(QPoint(100, 100),50, 50);pix.save("F:\\Qt\\QtProject\\pix2.jpg");//像素修改void Widget::paintEvent(QPaintEvent *event){QPainter painter(this);//利用QImage对像素进行修改QImage img;img.load(":/4.jpg");//修改像素点for(int i=50; i<100; i++){for(int j=50; j<100; j++){QRgb value = qRgb(255,0,0);img.setPixel(i,j,value);}}painter.drawImage(0,0,img);}

6.4.6 QPicture绘图设备

    //QPicture绘图设备 可以记录和重现绘图指令QPicture pic;QPainter painter;painter.begin(&pic);painter.setPen(QPen(Qt::cyan));painter.drawEllipse(QPoint(100, 100),50, 50);painter.end();pic.save("F:\\Qt\\QtProject\\pix2.zt"); //图片后缀可以任意void Widget::paintEvent(QPaintEvent *event)
{//重现QPicture的绘图指令QPainter painter(this);QPicture pic;pic.load("F:\\Qt\\QtProject\\pix2.zt");painter.drawPicture(100,100,pic);
}

七、QFile文件

7.1 文件读写

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton, &QPushButton::clicked, [=](){QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\hp\\Desktop");ui->lineEdit->setText(path);//QFile默认的支持格式是utf-8QFile file(path);//设置打开方式file.open(QIODevice::ReadOnly);QByteArray arry = file.readAll();ui->textEdit->setText(arry);file.close();//以追加方式进行写file.open(QIODevice::Append);file.write("帮到你人");file.close();});
}

7.2 QFileInfo文件信息类

       //QFileInfoQFileInfo info(path);qDebug()<<"大小:"<<info.size()<<"后缀名:"<<info.suffix()<<"文件名称:"<<info.fileName()<<"文件路径:"<<info.filePath();qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

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

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

相关文章

Shell和Linux权限

目录 shell Liunx权限 用户 sudo Linux的权限管理 文件访问者的分类 文件的属性 文件的权限 文件全权限值的表示方法 1.字符表示 2.八进制数值表示 用户符号 修改文件访问权限 修改文件拥有者 修改拥有者和所属组 修改所属组 文件目录的权限的含义 问题 粘滞…

程序员学CFA——数量分析方法(四)

数量分析方法&#xff08;四&#xff09; 常见概率分布基本概念离散型随机变量与连续型随机变量离散型随机变量连续型随机变量 分布函数概率密度函数&#xff08;PDF&#xff09;累积分布函数&#xff08;CDF&#xff09; 离散分布离散均匀分布伯努利分布二项分布定义股价二叉树…

Linux系统编程---线程同步

一、同步概念 同步即协同步调&#xff0c;按预定的先后次序运行。 协同步调&#xff0c;对公共区域数据【按序】访问&#xff0c;防止数据混乱&#xff0c;产生与时间有关的错误。 数据混乱的原因&#xff1a; 资源共享(独享资源则不会)调度随机(意味着数据访问会出现竞争)线…

算法模版自用(杂)

文章目录 算法库函数next_permutation(start,end) prev_permutation(start,end) (全排列函数)nth_element &#xff08;求第k小值&#xff09;next(it,num),prev(it,num)min_element(begin(),end()),max_element(begiin(),end()) (取最小值最大值) _int128的输入输出STLlist 数…

内容互动性的提升策略:Kompas.ai的智能工具

在数字营销的新时代&#xff0c;内容的互动性已成为提升用户参与度和品牌忠诚度的关键因素。互动性内容不仅能够吸引用户的注意力&#xff0c;还能够促进用户与品牌的沟通和交流&#xff0c;从而加深用户对品牌的理解和认同。本文将分析互动性内容在提升用户参与度中的作用及其…

基于DEAP数据集的四种机器学习方法的情绪分类

在机器学习领域&#xff0c;KNN&#xff08;K-Nearest Neighbors&#xff09;、SVM&#xff08;Support Vector Machine&#xff09;、决策树&#xff08;Decision Tree&#xff09;和随机森林&#xff08;Random Forest&#xff09;是常见且广泛应用的算法。 介绍 1. KNN&am…

【Java】从0实现一个消息队列中间件

从0实现一个消息队列中间件 什么是消息队列需求分析核心概念核心API交换机类型持久化网络通信网络通信API 消息应答 模块划分项目创建创建核心类创建Exchange创建MSGQueue创建Binding创建Message 数据库设计配置sqlite实现创建表和数据库基本操作 实现DataBaseManager创建DataB…

按现价和不变价计算与公布的统计指标主要有哪些

在经济统计和分析工作中 , 有些指标可以直接用实物量表示 , 如粮食和工业品产量等&#xff1b;而有些指标则是用价值量表示的 , 如全国居民人均可支配收入、社会消费品零售总额、商品房销售额等。在计算价值量指标时&#xff0c;一般均要考虑采用什么价格来计算。统计上常用的价…

设计模式(三):抽象工厂模式

设计模式&#xff08;三&#xff09;&#xff1a;抽象工厂模式 1. 抽象工厂模式的介绍2. 抽象工厂模式的类图3. 抽象工厂模式的实现3.1 创建摩托车的接口3.2 创建摩托车的具体实现3.3 创建汽车的接口3.4 创建汽车的具体产品3.5 创建抽象工厂3.6 创建具体工厂3.7 创建工厂生成器…

苹果一次性开源了8个大模型! 包含模型权重、训练日志和设置,OpenELM全面开源

不以开放性著称的苹果居然同时开源了大模型的权重、训练和评估框架&#xff0c;涵盖训练日志、多个保存点和预训练设置。同时升级计算机视觉工具包 CVNets 为 CoreNet&#xff01;支持 OpenELM&#xff01; ▲图1.由Stable Diffusion3生成。 OpenELM是Apple苹果公司最新推出的…

律师口才训练技巧课程介绍?

律师口才训练技巧课程介绍 一、课程背景与目标 律师口才作为法律职业的核心能力之一&#xff0c;对于律师在**辩论、法律咨询、谈判协商等场合的表现具有至关重要的作用。然而&#xff0c;许多律师在口才方面存在不足&#xff0c;难以充分发挥自己的专业能力。因此&#xff0c;…

底层逻辑(1) 是非对错

底层逻辑(1) 是非对错 关于本书 这本书的副标题叫做&#xff1a;看清这个世界的底牌。让我想起电影《教父》中的一句名言&#xff1a;花半秒钟就看透事物本质的人&#xff0c;和花一辈子都看不清事物本质的人&#xff0c;注定是截然不同的命运。 如果你看过梅多丝的《系统之美…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏&#xff1a;《体验AI》 期待您的点赞&#x1f44d;收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

为什么单片机控制电机需要加电机驱动

通常很多地方只是单纯的单片机MCU没有对电机的驱动能力&#xff0c;或者是介绍关于电机驱动的作用&#xff0c;如&#xff1a; 提高电机的效率和精度。驱动器采用先进的电子技术和控制算法&#xff0c;能够精准控制电机的参数和运行状态&#xff0c;提高了电机的效率和精度。拓…

【Hello算法】 > 第 3 关 >栈与队列

数据结构 之 数组与链表 1 栈 / 栈的常见操作、实现、应用2 队列 /队列的常见操作、实现、应用3 双向队列4 Tips ———————————————————————————————————————————————————————————- ————————————————…

Hybrid Homomorphic Encryption:SE + HE

参考文献&#xff1a; [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[MJS16] Maux P, Journault A, Standaert F X, et al. To…

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标&#xff1a;1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议&#xff08;UART、I2C、SPI等&#xff09;之一&#xff0c;全称叫做通用异步收发传输器&#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1&#xff09;为了避免区域间的环路&#xff0c;OSPF规定不同区域间的路由交互只能通过ABR实现。 2&#xff09;ABR是连接到骨干区域的&#xff0c;所以在区域设计上规定&#xff0c;所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…