Qt教程 笔记3

1. Qt 父子对象机制是在 QObject 中实现的。当利用一父对象创建一子对象(窗口部件、检验器、任意其他类型)时,父对象会把此子对象添加到自己的子对象列表中。
    当删除父对象时,会遍历子对象列表并删除每一个子对象。然后,子对象再去删除它们自己所包含的每个子对象。如此反复递归调用,直至清空所有子对象。
    这种父子对象机制很大程度上简化了内存管理,降低内存泄露的风险。需要明确删除的对象是那些使用new创建的并且没有父对象的对象。
    如果在删除父对象之前先删除其子对象,Qt会自动从父对象列表中移除子对象。


2. make / Makefile / CMake / qmake / NMAKE 介绍 (https://www.freesion.com/article/17111388082/)
    
        一. gcc (参考 GCC编译器 http://c.biancheng.net/view/679.html)
        
            1985 年由 MIT 教授理查德·斯托曼(Richard Stallman)提出了 GNU 计划(因英文名相同,GNU 的 logo 就是一只牛羚),并建立了自由软件基金会;
            GNU 通用公共授权书(GNU GPL, GNU General Public License)。
        
            GPL 协议的核心是源码公开,并允许任何人修改源码,但只要使用了 GPL 协议的软件源码,其衍生软件也必须公开源码,准许其他人阅读和修改源码,即 GPL 协议具有继承性。
        
            GNU 项目计划的主要目的是创建一个名叫 GNU’s Not Unix(GNU) 的完全免费的操作系统。这个操作系统的核心(kernel)就叫 HURD。
            GNU 在开发完全免费的操作系统上并未取得成功,20 世纪 90 年代由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)开发了 Linux 操作系统
            虽然 GNU 计划在开发免费操作系统上不成功,却成功开发几个广为流传的 GNU 软件,其中最著名的是 GNU C Complier(gcc)。
        
            gcc 已经可以支持 7 种编程语言和 30 种编程结构,是学术界最受欢迎的编译工具。
            
            GCC 原来代表“GNU C Compiler”的意思。面世后 GCC 逐渐扩充、发展,现在不仅支持C语言,还支持包括 C++、Ada、Objective-C、Fortran 和 Java 等。
            因此,GCC 的被重新定义为“GNU Compiler Collection”,也即“GUN 编译器套件”。
                        
            GCC 编译器在编译一个C语言程序时需要经过以下 4 步:
            1) 将C语言源程序预处理,生成.i文件。
            2) 预处理后的.i文件编译成为汇编语言,生成.s文件。
            3) 将汇编语言文件经过汇编,生成目标文件.o文件。
            4) 将各个模块的.o文件链接起来生成一个可执行程序文件。
            
            .i文件、.s文件、.o文件是中间文件或临时文件,使用 GCC 一次性完成C语言程序的编译,只能看到最终的可执行文件,这些中间文件都是看不到的,因 GCC 已经经它们删除了。
            
        
        二. make Makefile (参考 https://baike.baidu.com/item/Makefile/4619787?fr=aladdin ,https://blog.csdn.net/weixin_38391755/article/details/80380786)
                        
            Makefile
            一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,
            哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。
            
            Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、
            如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,
            一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。
            编译整个工程你所要做的事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。
            
            make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的IDE都有这个命令,
            比如:Delphi 的 make,Visual C++ 的 nmake,Linux下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。
            
            Linux(unix )环境下使用GNU 的 make 工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。
            不过这需要我们投入一些时间去完成一个或者多个称之为 Makefile 文件的编写。
                
        三. CMakeCMAKELISTS
        
            一些简单的工程 makefile 可以人工编写,但当工程非常大的时候,手写makefile也非常麻烦。
            如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用不同的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

            官网:(https://cmake.org/)
            CMake 是一个开源、跨平台的工具系列,旨在构建、测试项目和打包软件。
            CMake 通过简单平台和独立于编译器的配置文件来控制软件编译过程,根据所选编译器环境生成适用于本机的 makefile和工作区
            
            百度百科:(https://baike.baidu.com/item/cmake/7138032?fr=aladdin)
            CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。
            他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
            只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,
            而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
            这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,
            这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
                        
            在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
                ● 编写 CMake 配置文件 CMakeLists.txt 。
                ● 执行命令 cmake PATH (或ccmake PATH)生成 Makefile 1,ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。 PATH 指CMakeLists.txt 所在的目录。
                ● 使用 make 命令进行编译。
        
        四. 其他MAKE工具
        
            类似于GNU Make ,有其他的公司按照自己的标准构造了一套make工具,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。
            这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别.
            
            1)qmake
            
            官方网址https://doc.qt.io/archives/qt-4.8/qmake-manual.html
            
            qmake是一个工具,可简化跨同平台项目的构建过程。
            只需几行信息 qmake 可以自动生成Makefile。qmake可用于任何软件项目,无论是否用Qt编写。
            
            qmake根据项目文件中的信息生成一个Makefile。项目文件由开发人员创建,通常很简单,但是可以为复杂项目创建更复杂的项目文件。
            qmake包含其他功能来支持Qt开发,并自动包括moc和uic的构建规则。qmake还可以为Microsoft Visual Studio生成项目,而无需开发人员更改 project文件。
            
            
            2)NMAKE
            Microsoft 程序维护实用工具 (NMAKE。EXE) 是基于说明文件中包含的命令生成项目的 Visual Studio 附带的命令行工具。
            要使用 NMAKE,必须在开发人员命令提示窗口中运行它。 开发人员命令提示窗口具有为工具、库设置的环境变量,并且包括在命令行上生成所需的文件路径。
            
        
        cmake 也支持Qt程序的,cmake 也能生成针对 qt 程序的那种特殊 makefile, 只是 cmake 的 CMakeLists.txt 写出来相对与qmake的pro文件复杂点。
        qmake 是为 Qt 量身打造的,使用起来非常方便,但是cmake功能比qmake强大。 一般的Qt工程直接使用 qmake 就可以了,cmake 的强大功能一般人是用不到的。
    
    
    3. 编译MySQL驱动
        
        Compile only a specific sql driver        
        https://zhuanlan.zhihu.com/p/100669223
        
        Qt Documentation / SQL Database Drivers
        https://doc.qt.io/qt-5/sql-driver.html
        
        1) 环境变量 设置 g++ 路径:D:\Qt\Qt5.14.2\Tools\mingw730_64\bin
        2) cd D:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers
        3) qmake -version
            
              D:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers>qmake -version
              QMake version 3.1
              Using Qt version 5.14.2 in D:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib
            
        4) qmake  -- MYSQL_INCDIR="D:\mysql-8.0.17-winx64\include"  MYSQL_LIBDIR="D:\mysql-8.0.17-winx64\lib"            

D:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers>qmake -- MYSQL_INCDIR="D:\mysql-8.0.17-winx64\include" MYSQL_LIBDIR="D:\mysql-8.0.17-winx64\lib"

            Running configuration tests...
            Done running configuration tests.

            Configure summary:

            Qt Sql Drivers:
              DB2 (IBM) .............................. no
              InterBase .............................. no
              MySql .................................. yes
              OCI (Oracle) ........................... no
              ODBC ................................... yes
              PostgreSQL ............................. no
              SQLite2 ................................ no
              SQLite ................................. yes
              Using system provided SQLite ......... no
              TDS (Sybase) ........................... no

            Qt is now configured for building. Just run 'mingw32-make'.
            Once everything is built, you must run 'mingw32-make install'.
            Qt will be installed into 'D:\Qt\Qt5.14.2\5.14.2\mingw73_64'.

            Prior to reconfiguration, make sure you remove any leftovers from the previous build.
            
            注意:如果出现问题,希望qmake重新检查可用的驱动程序,则必须删除<QTDIR> / qtbase / src / plugins / sqldrivers中的config.cache-
            否则,qmake将不会重新搜索可用的驱动程序。 如果在qmake阶段遇到错误,请打开config.log以查看出了什么问题。        5) nmake sub-mysql
        6) nmake install
            如果未使用Microsoft编译器,以上命令请用 mingw32-make 替换 nmake。
            
        7) 将 D:\mysql-8.0.17-winx64\lib 目录下 libmysql.dlllibmysql.lib 
            拷贝至 D:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin
            
        8) 执行以下代码 测试                   

            void connect_mysql()
            {
                QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
                QString dbName = "mytest.db";

                if(db.isValid() == false)
                {
                    db = QSqlDatabase::addDatabase("QMYSQL", QString("con%1").arg(dbName));
                    db.setDatabaseName(QApplication::applicationDirPath()+dbName);    //如果本目录下没有该文件,则会在本目录下生成,否则连接该文件
                }
               
                db.setHostName("localhost");         //连接数据库主机名
                db.setPort(3306);                    //连接数据库端口号

                db.setUserName("root");              //数据库用户名
                db.setPassword("root");              //数据库密码
                db.setDatabaseName("test_db");       //连接数据库名
                db.open();
                if(!db.open())
                {
                    qDebug()<<"连接失败:"<<"connect to mysql error"<<db.lastError().text();
                    return ;
                }
                else
                {
                    qDebug()<<"连接成功!"<<"connect to mysql OK!";
                }
            }

    4. Qt 控制台调用 cout 和 cin 

        error: use of undeclared identifier 'cout'
        error: 'cout' was not declared in this scope
                cout << s << std::endl;

        添加库 #include<iostream>,并将 cout 改为std::cout 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值