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网路编程

 

  1. 在pro文件添加network
  2. 在头文件添加#include <QhoustAddress>
  3. 在头文件添加#include <QUdpSocket>

 

  1. 在public成员下定义 udpsocket对象

Qudpsocket *udpsocket

  1. 在cpp文件中 的构造函数中添加 udpSocket = new QudpSocket(this);
  2. 获取目标地址

 QString address;

QHostAddress address1;

address = ui->lineEdit_ip->text();

  address1 = QHostAddress(address);

  1. 获取目标端口

 quint16 port;

port = ui->lineEdit_port->text().toUInt();

  1. 发送数据
   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. 1.       Move()   移动

作用是设置QWidget部件的pos坐标。即设置左上角的坐标,来达到移动窗口的目的。

 计算公式:QWidget左上角坐标 = 鼠标当前坐标 - 鼠标按下时候坐标。

  1. 2.       QRect    构造矩形

使用整数精度定义平面中的矩形。

 

  1. 3.       QBitmap  取到二值化后的图

取到的图片像素只有01,(及黑和白)。

例:

QBitmap p = screen->grabWindow(QApplication::desktop()->winId(),capture_rect.x(), capture_rect.y(),capture_rect.width(),capture_rect.height());

 

  1. 4.       Qt绘图系统三个类 :QPainter QPaintDevice QPaintEngine

  --QPainter : 用来执行绘制的操作。

     --QPaintDevice : 是一个二维空间的抽象,这个空间可以由 QPainter在上面进行绘制。

-- QPaintEngine 提供了画笔给QPainter在不同的设备上      进行绘制的统一接口。

 

  1. 5.       绘图设备  QPixmapQBitmapQImageQPicture

 

 

  1. 6.       关于坐标 QPoint pos() globalPos()

             QPoint   : 坐标相对于桌面0——>0,0

              Pos      :  坐标相对于窗口0点——> (0,0)

              globalPos :  坐标相对于桌面0点——>(0,0)

 

  1. 7.       绘画  drawx1,y1,x2,y2

              四个参数:起始坐标(xy)和终点坐标(xy

 

  1. 8.       画矩形 drawRect (x , y , width , height)

                                      矩形左上角七点坐标,和宽高。

         用法:painter.drawRect(x , y , width , height);

 

  1. 9.       设置窗口固定大小 setFixedsize500,500

 

  1. 10.  设置坐标  this->move(100,100)

            Button->move(20,20)

  1. 11.  设置大小(非固定):this->resize(600,600)

 

  1. 12.  自定义类给控件设置父类:

mybutton * but = new mybutton;

               but->setParent(this);

               but->resize(100,100);

 

 

  1. 13.  设置无边框窗口

   setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint);

 

  1. 14.  设置窗体透明度(使窗体上的控件也透明度)

 this->setWindowOpacity(0.5);

 

  1. 15.  关闭父窗口同时关闭子窗口

setAttribute(Qt::WA_QuitOnClose,false);

 

  1. 16.  设置窗口无边框

this->setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint);

 

  1. 17.  设置窗体背景颜色

this->setStyleSheet("background-color:red");   红色

 

  1. 18.  判断定时器的状态是开启还是停止
 if(this->timer->isActive())

    {

        this->timer->stop();

    }

    else

{}

  1. 19.       查看Qarraybyte数组大小

QByteArray arrayw;

arrayw.size()

 

  1. 20.       输出Qarraybyte的成员

QByteArray arrayw;

qDebug()<<QByteArray(arrayw);

 

 

  1. 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));

posted @ 2022-05-09 21:53  雾枫  阅读(512)  评论(0编辑  收藏  举报