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< 访问方法和c语言是一样的,普通访问通过 . 进行访问,指针访问通过 -> 进行方访问 8.类的函数成员 因为类里面的成员既可以是变量,也可以是函数 第一步:在类里面声明函数 第二步:在类里面实现函数,实现函数我们可以在类里面也可以在类外面。 在里面实现: class student { public: student() {} char name[12]; int age; void test0() { cout<<"hello word"< } }; 在类外面实现: class student //定义一个类 student { public: student() {} char name[12]; int age; void test0(); }; void student::test0() //student::表示属于这个类里面的函数,不加的话会被识别成普通的函数 { cout<<123< } 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"< } student(int b); ~student() //析构函数 { cout<<"369"< } }; 构造函数是可以被重载的,析构函数不可以被重载 (注意:对象访问带参数的构造函数,只能使用在堆区创建的对象进行访问————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工程? 步骤一: 步骤二: 步骤三: 步骤四: 步骤五: 点击froms文件,然后点击ui文件,进入ui编辑器 1. 我们用到的组件: 放图片、放问本、放gif图的组件就是Qlabl。 2.放账号和密码的对话框我们用的组件是: Qlineedit 3.按钮我们使用的组件是 Qpushbutton 1.给控件改名字 为了分析方便,我们要给控件改名字,要通俗易懂。 2.什么是信号和槽 信号: 信号就是控件发出特定的信号; 点击(信号) 比如按钮的信号: 拴牢(信号) 发布(信号) 按下(信号) 槽: 槽就是槽函数的意思,我们可以把槽函数绑定在某一个空间的信号上 3.怎么关联信号和槽 连接槽前必须要做的:修改控件的名称 自动关联 手动选择控件,右键->转到槽。 自动关联会给我们的工程添加以下内容: 1.声明槽函数 2 槽函数只能声明到private slots:或者public slots:下面 2. 实现槽函数 手动关联 手动关联使用 connect这个函数 connect(ui->logoBt,SIGNAL(clicked()),this,SLOT(logoBt_clicked_slots())); 翻译:连接(ui—>登录按钮,信号(点击()),shis,插槽(函数名())) 练习: 判断用户的账号和密码是否和给定的一样,如果一样提示登录成功: 1. 添加资源文件(首先将图片文件放置于工程目录下) 2. 引用图片 注意:label(标签)和pushbutton(按钮),引入图片方式一样 首先设置图片尺寸 1. 水平布局 2. 垂直布局 3. 栅格布局 1. 创建一个新的ui界面 2.进行界面切换 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.清空数据功能 第一步: 声明一个指针 串口对象 5 第二步、初始化 我们点击打开串口时实现对数据的初始化 对 打开串口—按钮 进行信号和槽函数的定义: 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文件名称 网络编程有: 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,添加打开按钮槽函数。 添加头文件 用到两个类: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.代码编辑 添加城市——删除所有项目 1.编辑ui界面 2.给控件改名字 3.代码编辑: 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
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网路编程 Qudpsocket
*udpsocket QString address; QHostAddress address1; address = ui->lineEdit_ip->text(); address1 = QHostAddress(address); quint16 port; port = ui->lineEdit_port->text().toUInt(); 复制内存: memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob) QByteArray array_0; array_0.resize(256); qDebug()<<"sizeof(array_0)="< #include { QTime dieTime = QTime::currentTime().addMSecs(mesc); while (QTime::currentTime() QCoreApplication::processEvents(QEventLoop::AllEvents,100); } ui->lineEdit_all_packet->setText(QString("%1").arg(10); 作用是设置QWidget部件的pos坐标。即设置左上角的坐标,来达到移动窗口的目的。 计算公式:QWidget左上角坐标 = 鼠标当前坐标 - 鼠标按下时候坐标。 使用整数精度定义平面中的矩形。 取到的图片像素只有0或1,(及黑和白)。 例: QBitmap p = screen->grabWindow(QApplication::desktop()->winId(),capture_rect.x(), capture_rect.y(),capture_rect.width(),capture_rect.height()); --QPainter : 用来执行绘制的操作。 --QPaintDevice : 是一个二维空间的抽象,这个空间可以由 QPainter在上面进行绘制。 -- QPaintEngine :提供了画笔给QPainter在不同的设备上 进行绘制的统一接口。 QPoint : 坐标相对于桌面0点——>(0,0) Pos : 坐标相对于窗口0点——> (0,0) globalPos : 坐标相对于桌面0点——>(0,0) 四个参数:起始坐标(x,y)和终点坐标(x,y) 矩形左上角七点坐标,和宽高。 用法:painter.drawRect(x , y , width , height); Button->move(20,20) mybutton * but = new mybutton; but->setParent(this); but->resize(100,100); setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint); this->setWindowOpacity(0.5); setAttribute(Qt::WA_QuitOnClose,false); this->setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint); this->setStyleSheet("background-color:red"); 红色 { this->timer->stop(); } else {} QByteArray arrayw; arrayw.size() QByteArray arrayw; qDebug()< 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));二、 做一个简单的qt界面
三、 Qt工程文件解析
四、 UI设计器按钮和功能
五、 做一个简单的QQ登录界面
六、 信号和槽
七、 设计样式——给工程添加图片
八、QT下的布局
九、界面切换
十、 实现返回功能
十一、Qt的三驾马车
十二、 仿写串口助手
十三、 程序打包部署
十四、 Qt的网络编程:
十五、qt定时器
十六、 新篇章学习
十七、 计算器案例
十八、编辑记事本
十九、 获得系统特定目录
二十、 listWidget控件
二十一、 MySql数据库
二十二 、QML
udpsocket->writeDatagram(array,array.length(),address1,port);
qt中获取数组大小
qt延时
void Dialog::time(int mesc) //mesc = 1000 延时1秒
整型转字符串
桌面采集笔记
if(this->timer->isActive())
模态与非模态