qt入门笔记
Qt随笔
一、 Qt c++基础
1. Qt的移植性是非常的强。一套代码不需要改太多,直接通用所有平台。
2. 不久的将来qt被用到单片机上。
1.什么是C++
c++是c语言的升级版,在c的基础上增加了许多新功能,是一种高级语言。
2.什么是面向对象,什么是面向过程
c语言就是面向过程,c++就是面向对象
举例: a+b
直接计算a+b就是面向过程。
面向对象就是给a+b穿上一件衣服,不是直接计算a+b。
3.c++的灵魂,是c++的类
类可以看成是c语言结构体的升级版,类的成员不仅可以是变量,也可以是函数。
4.如何定义一个类
class student
{
public:
student() {}
char name[12];
char age;
}
5.什么是对象
对象是类的实例化(通过类引出的对象)
6.如何定义一个对象
直接定义:
student my; //student就是类 ,my就是对象
在堆区里面定义:
student *my1 = new student;
删除对象:
delete my; //目的释放堆里面的内存
//注意:这种方法只能删除堆里面的对象,而不能删除直接定义的对象
7.怎么访问类的成员
student my;
student *my1 = new student;
my.age=45;
my1->age=25;
cout<<my.age<<"\n"<<my1->age<<endl;
访问方法和c语言是一样的,普通访问通过 . 进行访问,指针访问通过 -> 进行方访问
8.类的函数成员
因为类里面的成员既可以是变量,也可以是函数
第一步:在类里面声明函数
第二步:在类里面实现函数,实现函数我们可以在类里面也可以在类外面。
在里面实现:
class student
{
public:
student() {}
char name[12];
int age;
void test0()
{
cout<<"hello word"<<endl;
}
};
在类外面实现:
class student //定义一个类 student
{
public:
student() {}
char name[12];
int age;
void test0();
};
void student::test0() //student::表示属于这个类里面的函数,不加的话会被识别成普通的函数
{
cout<<123<<endl;
}
9.类的访问修饰符
类的访问修饰符就是对类的成员进行权限管理。
public: 表示函数和变量是公开的,任何人都可以进行访问。
private: 表示函数和对象只能在自己类里面自己访问自己,不能通过对象来访问。(可以进行强行访问)
protected: 表示函数和对象只能在自己类里面自己访问自己,不能通过对象来访问,但是可以通过派生类进行访问。
10.类函数的重载特性
类函数重载特性就是,我们可以在类里面定义同名的函数,但是参数不同的函数。
class student
{
public:
student() {}
char name[12];
int age;
void test0();
void test0(int a);
private:
int bbt;
};
重载函数在调用的时候,会根据参数的类型,然后去匹配相应的函数进行调用
11.构造函数和析构函数
析构函数:假如我们定义了析构函数,当对象被删除或者生命周期结束的时候,就会触发析构函数。
构造函数;假如我们定义了构造函数,就触发了构造函数。
我们要怎么定义析构函数和构造函数:
1.构造函数和析构函数的名字必须和类名一样
2.析构函数名需要在前面加 ~ ,
class student
{
public:
student() //构造函数
{
cout<<"9898989"<<endl;
}
student(int b);
~student() //析构函数
{
cout<<"369"<<endl;
}
};
构造函数是可以被重载的,析构函数不可以被重载
(注意:对象访问带参数的构造函数,只能使用在堆区创建的对象进行访问————student *my1 = new student(201);)
12.类的继承:
什么是类的继承:
类的继承允许我们在新的类里面继承父亲的public还有 prorected部分,Private是不能被继承的。
当我们觉得这个类不好的时候,就可以使用类的继承,添加我们需要功能。
格式:
class儿子:public爸爸
{
public:
........
prorected:
}
实际例子:class son:public student
{
public:
int score;
};
13.虚函数和纯虚函数
虚函数:有实际定义的,允许派生类对他进行覆盖时的替换。 virtual来修饰
纯虚函数:没有实际定义的虚函数就是纯虚函数,
怎么定义一个虚函数:
用virtaul来修饰,虚函数用在类的继承上。
例子:
virtual void test0() ; //虚函数
void test1() {};//纯虚函数,没有任何定义,内部是空的
虚函数的优点:可以预留接口。
二、 做一个简单的qt界面
一、 如何创建qt工程?
步骤一:
步骤二:
步骤三:
步骤四:
步骤五:
三、 Qt工程文件解析
四、 UI设计器按钮和功能
点击froms文件,然后点击ui文件,进入ui编辑器
五、 做一个简单的QQ登录界面
1. 我们用到的组件:
放图片、放问本、放gif图的组件就是Qlabl。
2.放账号和密码的对话框我们用的组件是: Qlineedit
3.按钮我们使用的组件是 Qpushbutton
六、 信号和槽
1.给控件改名字
为了分析方便,我们要给控件改名字,要通俗易懂。
2.什么是信号和槽
信号:
信号就是控件发出特定的信号;
点击(信号) |
比如按钮的信号:
拴牢(信号) |
发布(信号) |
按下(信号) |
槽:
槽就是槽函数的意思,我们可以把槽函数绑定在某一个空间的信号上
3.怎么关联信号和槽
连接槽前必须要做的:修改控件的名称
自动关联
手动选择控件,右键->转到槽。
自动关联会给我们的工程添加以下内容:
1.声明槽函数
² 槽函数只能声明到private slots:或者public slots:下面
2. 实现槽函数
手动关联
手动关联使用 connect这个函数
connect(ui->logoBt,SIGNAL(clicked()),this,SLOT(logoBt_clicked_slots()));
翻译:连接(ui—>登录按钮,信号(点击()),shis,插槽(函数名()))
练习: 判断用户的账号和密码是否和给定的一样,如果一样提示登录成功:
七、 设计样式——给工程添加图片
1. 添加资源文件(首先将图片文件放置于工程目录下)
2. 引用图片
注意:label(标签)和pushbutton(按钮),引入图片方式一样
八、QT下的布局
首先设置图片尺寸
1. 水平布局
2. 垂直布局
3. 栅格布局
九、界面切换
1. 创建一个新的ui界面
2.进行界面切换
十、 实现返回功能
十一、Qt的三驾马车
1.qt下的串口编程
2.qt下的网络编程
3.qt下操作GPIO
十二、 仿写串口助手
一、设计ui界面
组合框 |
接受框:
属性选择:
发送框:
按钮:
组合框:
Ui界面设计完成:
二、完成之后设置接收框属性:
接收框只能读不能写 (接收框只能读取数据不能写入数据):
设置:
三、布局
四.设置 波特率、数据位、校验位、停止位、属性:
如 波特率 设置:
效果:
五、改名称 (给控件改名称)
串口号—选择控件 :SerialPortCb
波特率—选择控件 :BaudrateCb
数据位—选择控件 :DatabitsCb
停止位—选择控件 :StopbitsCb
校验位—选择控件 :CheckCb
打开串口—按钮控件 :OpenBt
关闭串口—按钮控件 :CloseBt
发送数据—按钮控件 :SendBt
清空数据—按钮控件 :EmptyBt
发送框——控件 :SendEdit
接收框——控件 :ReceiveEdit
(串口标签、波特率标签、数据位标签、停止位标签、校验位标签 用不到,就不需要改名字了)
六、 在工程文件夹下添加串口类 (serialport)
串口需要用到一个类
七、添加 串口号代码: (获取串口信息代码 + 显示到ui界面代码)
效果:
八、实现逻辑功能
1.打开串口功能
2.关闭串口功能
3.发送数据功能
4.清空数据功能
第一步:
3 声明一个指针 串口对象 |
5 |
4 |
第二步、初始化
我们点击打开串口时实现对数据的初始化
对 打开串口—按钮 进行信号和槽函数的定义:
5 确认 |
4选择clicked()
|
再编辑以下代码
最简单的串口助手软件就制作完成了。
注意:接收取数据框 需要手动关联槽函数。
十三、 程序打包部署
什么是打包和部署?
因为我们要把写好的程序发给客户来用,我们写好的源码也不是随便给别人看的,
在打包和部署?
1.我们把工程切换到 release 模式,然后编译。
release 模式:精简 基本没有调试信息
debug 模式 :又很多调试信息
2.找到release 模式构建的文件夹。
3.修改图标,先把图标加到工程所在文件夹,在pro文件添加这句话: RC_ICONS=SafariSilver.ico(SafariSilver.ico是图标名称)
注意:图标格式必须是.ico这个格式,其他的格式不行
4.封包操作,需要用到qt的控制台
接下来在桌面创建一个文件夹,千万不要有中文路径,然后把.exe文件拷贝到新创建的文件夹里,如下:
在qt控制台使用命令进入我们新创建的文件夹所在的路径下,命令如下;
最后一步: 我们使用windeployqt工具把库加入到我们新创建的这个文件里面。如下:
格式:windeployqt .exe文件名称
十四、 Qt的网络编程:
网络编程有: TCP和UDP
TCP编程需要用到两个类:QTcpServer和QTcpSorcket
(QTcp服务器和QTcp网络编程)
TCP协议分为客户端和服务器两部分:客户端只用到QTcpSorcket这个类,服务器端QTcpServer和QTcpSorcket两个类都用到。
TCP编程:
一、先写一个tcp服务器端
1.创建ui界面
2.给控件改名字
接收框:receiveEdit
端口号框:portEdit
发送框:sendEdit
打开服务器按钮:openBt
关闭服务器按钮:closeBt
发送按钮:sendBt
3.编辑逻辑代码
首先我们编辑的server服务器,服务器要监听所有人给他发来的消息。
打开帮助文档,查看QTcpServer类下面的功能函数,找到监听的功能函数:(查看使用方法)
二、再写一个tcp客户端
1.创建ui界面
2.给控件改名字
接收框:receiveEdit
端口号框:portEdit
ip地址框:ipEdit
发送框:sendEdit
打开客服端按钮:openBt
关闭客户端按钮:closeBt
发送按钮:sendBt
2.编辑逻辑代码
UDP编程:
UDP不分客户端和服务器,只用到一个类:QUdpSocket
1.添加头文件
2.编辑ui界面
(接收框设置成只读)
3.给控件该名字
接收框:receiveEdit
本地端口号框:localportEdit
目标端口号:aimportEdit
目标ip地址框:aimipEdit
发送框:sendEdit
打开按钮:openBt
关闭按钮:closeBt
发送按钮:sendBt
2.编辑逻辑代码
点击打开的时候,将端口号绑定到soeket,添加打开按钮槽函数。
添加头文件
十五、qt定时器
用到两个类:Qtime qt的时间类
Qtimer qt的定时类
UI编辑:
Label :显示时间
Pushbutton:按钮
Text Browser:保存打点
2.给控件该名字
开始按钮:starBt
停止按钮topBt
重置按钮:resetBt
打点按钮:bitBt
显示时间窗口:showTime
保存打点窗口:bitTime
3.代码编辑
十六、 新篇章学习
1.手工部局
2.固定窗口大小
3.启动一个进程
十七、 计算器案例
1.创建Qminwidget基类工程
2.编辑ui界面
3.给控件改名字
2.代码编辑:
十八、编辑记事本
1.设计ui界面
2.编辑文件菜单及子菜单
3.编辑菜单及子菜单
4.改名字
5.代码编辑
6.添加图标
7.工具栏添加图标
8.编辑区背景
(选中textEdit文本框右键->编辑样式表->选择资源->第二个)
9.设置应用程序图标
.1在工程目录文件下添加文件夹->myapp.rc
.2 将这句话复制到刚才的文件里面:IDI_ICON1 ICON DISCARDABLE "myappico.ico"
3.在工程文件加入这句话:RC_FILE = myapp.rc
效果如图:
4.添加程序动画图
效果:
十九、 获得系统特定目录
1.创建ui界面
2.修改类名
3.代码编辑
二十、 listWidget控件
添加城市——删除所有项目
1.编辑ui界面
2.给控件改名字
3.代码编辑:
二十一、 MySql数据库
1.数据库目录结构:
2.用于显示当前存在的所有数据库:
show databases;
3.创建数据库:
create database 数据库名字;
4.创建数据库表(表头):
create table information(id int,name text,serial text,address text);
5.用于显示数据库下的所有的数据库表:
show tables;
6.查看数据库表的详细结构:
desc 数据库表名;
7.向表中插入数据:
insert into 表名 values(1,”王川”,”123”,”河北”);
8.把列表中所有的数据显示出来:
select *from 表名;
9.指定显示表中显示的数据内容:
select name form表名 where name=”王川”;
10.显示此内容的所有数据:
select *from 表名 where name=”王川”;
11.select 非常重哟:
比如计算:select 10*10;
显示时间:select current_time;
显示当前日期:select current_date;
12. seek(int n) :query 指向结果集的第 n 条记录。
first() :query 指向结果集的第一条记录。
last() :query 指向结果集的最后一条记录。
next() :query 指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。
previous() :query 指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。
record() :获得现在指向的记录。
13. value(int n) :获得属性的值。其中 n 表示你查询的第 n 个属性,比方上面我们使用“select * from student”就相当于“select id, name from student”,那么 value(0)返回 id 属性 的值,value(1)返回 name 属性的值。该函数返回 QVariant 类型的数据,关于该类型与其他类 型的对应关系,可以在帮助中查看 QVariant
二十二 、QML
1.自定义样式:(按钮)
QPushButton{
/*背景色*/
background-color: rgba(100, 225, 100, 30);
/*边框样式*/
border-style:outset;
/*边框宽度为4像素*/
border-width:4px;
/*边框圆角半径*/
border-radius:10px;
/*边框颜色*/
border-color:rgba(255,225,80);
/*字体*/
font:bold 14px;
/*字体颜色*/
color:rgba(0,0,0,100);
/*填衬*/
padding 6px;
}
/*鼠标悬停在按钮上时*/
QPushButton:hover{
background-color:rgba(100,255,100,100);
border-color:rgba(255,225,255,200);
color:rgba(0,0,0,200);
}
/*按钮被按下时*/
QPushButton:pressed{
background-color:rgba(100,255,100,200);
border-color:rgba( 200,123,100,30);
border-style:inset;
color:rgba(0,0,0,100);
}
2.滑块部件自定义样式:
/*水平滑块的手柄*/
QSlider::handle:hoorizontal{
image:url(:/new/pic/车.jpeg);
}
/*水平滑块手柄以前的部分*/
QSlider::sub-page:horizontal{
/*边框图片*/
border-image:url(:/new/pic/staff_1024.jpg);
}
Qt udp网路编程
- 在pro文件添加network
- 在头文件添加#include <QhoustAddress>
- 在头文件添加#include <QUdpSocket>
- 在public成员下定义 udpsocket对象
Qudpsocket *udpsocket
- 在cpp文件中 的构造函数中添加 udpSocket = new QudpSocket(this);
- 获取目标地址
QString address;
QHostAddress address1;
address = ui->lineEdit_ip->text();
address1 = QHostAddress(address);
- 获取目标端口
quint16 port;
port = ui->lineEdit_port->text().toUInt();
- 发送数据
udpsocket->writeDatagram(array,array.length(),address1,port);
复制内存:
memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob)
qt中获取数组大小
QByteArray array_0;
array_0.resize(256);
qDebug()<<"sizeof(array_0)="<<array_0.size();
qt延时
#include <Qtime>
void Dialog::time(int mesc) //mesc = 1000 延时1秒
{
QTime dieTime = QTime::currentTime().addMSecs(mesc);
while (QTime::currentTime()<dieTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
}
}
整型转字符串
ui->lineEdit_all_packet->setText(QString("%1").arg(10);
桌面采集笔记
- 1. Move() 移动
作用是设置QWidget部件的pos坐标。即设置左上角的坐标,来达到移动窗口的目的。
计算公式:QWidget左上角坐标 = 鼠标当前坐标 - 鼠标按下时候坐标。
- 2. QRect 构造矩形
使用整数精度定义平面中的矩形。
- 3. QBitmap 取到二值化后的图
取到的图片像素只有0或1,(及黑和白)。
例:
QBitmap p = screen->grabWindow(QApplication::desktop()->winId(),capture_rect.x(), capture_rect.y(),capture_rect.width(),capture_rect.height());
- 4. Qt绘图系统三个类 :QPainter、 QPaintDevice 、QPaintEngine
--QPainter : 用来执行绘制的操作。
--QPaintDevice : 是一个二维空间的抽象,这个空间可以由 QPainter在上面进行绘制。
-- QPaintEngine :提供了画笔给QPainter在不同的设备上 进行绘制的统一接口。
- 5. 绘图设备: QPixmap、QBitmap、QImage、QPicture
- 6. 关于坐标: QPoint 、pos() 、globalPos()
QPoint : 坐标相对于桌面0点——>(0,0)
Pos : 坐标相对于窗口0点——> (0,0)
globalPos : 坐标相对于桌面0点——>(0,0)
- 7. 绘画: draw(x1,y1,x2,y2)
四个参数:起始坐标(x,y)和终点坐标(x,y)
- 8. 画矩形: drawRect (x , y , width , height)
矩形左上角七点坐标,和宽高。
用法:painter.drawRect(x , y , width , height);
- 9. 设置窗口固定大小: setFixedsize(500,500)
- 10. 设置坐标: this->move(100,100)
Button->move(20,20)
- 11. 设置大小(非固定):this->resize(600,600)
- 12. 自定义类给控件设置父类:
mybutton * but = new mybutton;
but->setParent(this);
but->resize(100,100);
- 13. 设置无边框窗口
setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint);
- 14. 设置窗体透明度(使窗体上的控件也透明度)
this->setWindowOpacity(0.5);
- 15. 关闭父窗口同时关闭子窗口
setAttribute(Qt::WA_QuitOnClose,false);
- 16. 设置窗口无边框
this->setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint);
- 17. 设置窗体背景颜色
this->setStyleSheet("background-color:red"); 红色
- 18. 判断定时器的状态是开启还是停止
if(this->timer->isActive())
{
this->timer->stop();
}
else
{}
- 19. 查看Qarraybyte数组大小
QByteArray arrayw;
arrayw.size()
- 20. 输出Qarraybyte的成员
QByteArray arrayw;
qDebug()<<QByteArray(arrayw);
- 21. QmessageBox 消息提示框使用:
QMessageBox::question(this,
tr("弹窗标题"),
tr("弹窗内容"),
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Ok);
QMessageBox::information(this,
tr("Information消息框标题"),
tr("这是Information消息框的内容。"),
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Ok);
QMessageBox::warning(this,
tr("Warning消息框"),
tr("您修改的内容还未保存,是否要保存对文档的修 改?"),QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,QMessageBox::Save);
QMessageBox::critical(this, tr("Critical消息框"), tr("这是一 个Critical消息框!"));
QMessageBox::about(this, tr("About消息框"), tr("这是一个About消息框测试!"));
模态与非模态
在Qt中,显示一个对话框一般有两种方式:
一种是使用exec()方法,它总是以模态来显示对话框;
另一种是使用show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的modal属性。其定义如下:
modal:bool默认情况下,对话框的该属性值是false,这时通过show()方法显示的对话框就是非模态的。而如果将该属性值设置为true,就设置成了模态对话框,其作用于把QWidget::windowModality属性设置为Qt::ApplicationModal。
而使用exec()方法显示对话框的话,将忽略modal属性值的设置并把对话框设置为模态对话框。一般使用setModal()方法来设置对话框的modal属性。
◆ 如果要设置为模态对话框,最简单的就是使用exec()方法,示例代码如下:
MyDialog myDlg; myDlg.exec();也可以使用show()方法,示例代码如下:
MyDialog myDlg; myDlg.setModal(true); myDlg.show();
◆ 如果要设置为非模态对话框,必须使用show()方法,示例代码如下:
MyDialog myDlg; myDlg.setModal(false);
或者myDlg.setModal();myDlg.show();
Lable设置图片
QImage srcImage(":/iee.png");
ui->labelicon->setPixmap(QPixmap::fromImage(srcImage));
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程