Qt深入浅出(一) 从零开始写Qt应用

1 Qt简单介绍

1.1 什么是Qt

​ Qt是1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI(Graphical User Interface)程序,也可用于开发非GUI程序,比如控制台程序。与windows上面的MFC是同一类东西。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能,并且Qt很容易扩展。

​ Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的IDE(integrated development environment),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。

​ Qt真正指的是Qt库,并不是Qt Creator,官网上面的Qt版本号5.7.0也是指的是Qt库的版本,开发者也可以使用VS集成开发环境来开发基于Qt的应用程序。

1.2 优良的跨平台特性

​ Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。

​ Qt在各个平台上都封装了同一套对外的编程接口API(Application Program Interface),开发者可以在一个平台上编写Qt程序, 同时可以将不经过任何修改的代码放到其它平台中编译, 可以生成对应平台的应用程序.

  简单来说,就是一份代码到处编译。

1.3 第一个Qt GUI应用

​ 使用Qt Creator集成开发环境开发应用是通过qmake来组建项目,qmake与cmake类似,qmake语法更简单,cmake功能更强大。

​ qmake能够自动生成Makefile、Microsoft Visual Studio 专案文件。不管源代码是否是用Qt写的,都能使用qmake,因此qmake能用于很多软件的构建过程,qmake文件的后缀一般为.pro。

  1. 新建qmake空项目,添加main.cpp源文件


  2. 编写.pro项目工程qmake文件,加上QT变量

    ​  

  3. main.cpp中添加QApplication头文件,并且实例化

    #include <QApplication>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv); //每个Qt应用只能有一个QApplication对象,QApplication对象主要用来处理主程序控制流和主要设置。
    }

  4. 添加QWidget头文件,实例化对象,调用QWidget对象的show函数显示

    #include <QApplication>
    #include <QWidget>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        QWidget widget; //Qt中每个窗口都是QWidget对象,或者其派生类的对象。
        widget.show();
    }

  5. 调用QApplication::exec()消息循环, 接受来自桌面系统的消息

    #include <QApplication>
    #include <QWidget>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        QWidget widget;
        widget.show();
        return app.exec(); //消息循环,消息泵,阻塞接收桌面系统传递过来的消息。
    }
  6. 设置窗口标题

    #include <QApplication>
    #include <QWidget>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        QWidget widget;
        widget.setWindowTitle("helloworld");
        widget.show();
        return app.exec();
    }

重要知识:

  1、Qt中大部分的类都是继承至QObject,QObject是最基本的类, 通过帮助文档可查看继承关系。

  2、QApplication用来管理界面应用的控制流以及主要的程序设置。在Qt中不管有多少的窗口,QApplication实例对象都只有一个。

​ 3、QWidget 在Qt中是所有窗口类的基类。

2 认识窗口

2.1 窗口大小

​ Qt中每一个窗口都可以设置其窗口大小,以像素为单位。

void QWidget::resize(int w, int h) //设置窗口大小
QSize size() const   //获取窗口大小,返回的是QSize,QSize封装了宽高

2.2 窗口坐标系

​ Qt中每一个窗口都有一个坐标系统,默认的,窗口左上角为坐标原点,水平向右递增,水平向左递减,垂直向下递增,垂直向上递减。原点即为(0,0)点,以像素为单位增减。

​ 如图:

2.3 窗口关系

​ 普通窗口可以以顶级窗口方式显示,比如直接调用show函数来显示;也可以嵌套在其它窗口上来显示,这个时候被嵌套的窗口叫做父窗口,嵌套的窗口叫做子窗口。(注意:父子窗口是对象间的组合关系,不是父子类继承关系)

​ 子窗口位置坐标参考的是父窗口的坐标系。

​ 顶级窗口其父窗口就是桌面,桌面也可以认为是一个窗口。

  • 设置父窗口

void QWidget::setParent(QWidget *parent)

例如:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget widget;
    QPushButton pb;
    pb.setParent(&widget);  //注意将按钮嵌套到widget窗口中的时候,必须在widget对象调用show函数之前,否则pb窗口不显示。
    widget.show();
    return app.exec();
}

  • 设置窗口位置坐标

void QWidget::move(int w, int h)   //设置窗口位置,单位像素
void QWidget::setGeometry(int x, int y, int w, int h) //设置窗口几何属性,坐标与大小,单位像素
QPoint pos() const     //获取窗口位置,返回QPoint类对象,QPoint封装了x、y坐标

注意:窗口移动的作用点是该窗口的坐标原点,也就是窗口的左上角。


2.4 使用信号槽

​ 信号和槽用于两个QObject对象或者其派生类之间的通信,信号和槽机制是Qt的核心特征,也是Qt不同于其它开发框架的最突出的特征。

​ 例如:QPushButton对象点击之后会发射出一个clicked()信号,我们现在要把这个信号传递给QWidget对象,并且让QWidget对象调用close()函数关闭窗口。

  • 那么要使用到QObject的一个静态函数connect:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection);

/*将sender对象的信号signal链接到receiver对象的槽函数method,并且返回一个QMetaObject::Connection对象,可以使用该对象调用disconnect函数来注销链接。
type一般选用默认参数即可。
*/

​ 源码:

#include <QApplication>
#include <QWidget> 
#include <QPushButton>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget widget;  
    QPushButton pb;
    pb.setParent(&widget);
    QObject::connect(&pb, SIGNAL(clicked()), &widget, SLOT(close()));
    widget.show();
    return app.exec();
}

  • 信号作为connect的传入参数时候需要使用SIGNAL()这个宏函数来包装一下

  • 槽函数作为connect的传入参数时候需要使用SLOT()这个宏函数来包装一下

初步认识就到这里,后面会再详细介绍Qt中的信号槽机制。

  • 43
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
本课程详细、全面地介绍了 Qt 开发中的各个技术细节,并且额外赠送在嵌入式端编Qt程序的技巧。整个课程涵盖知识点非常多,知识模块囊括 Qt-Core 组件、QWidgets、多媒体、网络、绘图、数据库,超过200个 C++ 类的分析和使用,学完之后将拥有 Qt 图形界面开发的非常坚实的功底。 每个知识点不仅仅会通过视频讲解清楚,并且会配以精心安排的实验和作业,用来保证学习过程中切实掌握核心技术和概念,通过实验来巩固,通过实验来检验,实验与作业的目的是发现问题,发现技术盲点,通过答疑和沟通夯实技术技能。注意:本套视频教程来源于线下的实体班级,因此视频中有少量场景对话和学生问答,对此比较介意的亲们谨慎购买。注意:本套视频教程包含大量课堂源码,包含对应每个知识点的精心编排的作业。由于CSDN官方规定在课程介绍中不能出现作者的联系方式,因此在这里无法直接给出QQ答疑号,视频中的源码、资料和作业文档链接统一在购买后从CSDN平台跟我沟通,我会及时回复跟进。注意:本套视频教程包含全套10套作业题,覆盖所有视频知识点,循序渐进,各个击破,作业总纲如下:下面是部分作业题目展示,每道题都有知识点说明,是检验学习效果的一大利器:(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)…… ……
### 回答1: 首先,使用Qt SerialPort API定义多线程应用程序的结构,然后实现Qt SerialPort API的各种功能,以便于多线程应用程序能够正常使用串口通信。最后,在多线程应用程序中利用Qt SerialPort API的功能,实现串口的实时数据传输与处理。 ### 回答2: 使用Qt SerialPort API编一个多线程应用程序主要包括以下步骤: 1. 首先,我们需要创建一个Qt应用程序,并在项目文件中包含QT += serialport。 2. 在主线程中创建一个QSerialPort对象,用于与串口进行通信。可以通过设置串口的参数、打开串口等来配置串口。 3. 创建一个自定义的线程类,继承QThread类,并重run()方法。在run()方法中进行串口的读操作。 4. 在自定义的线程类中,使用QSerialPort类提供的read()和write()函数进行串口数据的读取和入。可以根据需求设置读取和入的数据量和频率。 5. 在主线程中创建多个自定义线程的对象,并调用start()函数启动线程。 6. 在主线程中,通过信号与槽机制将串口收到的数据传递给其他需要的部分。可以使用自定义信号和槽或者Qt提供的信号和槽来实现数据的传递。 7. 在主线程中,可以通过调用线程的wait()函数等待线程结束,并在需要时通过调用线程的terminate()函数终止线程。 8. 在应用程序退出时,记得关闭串口并释放相关资源。 总之,通过使用Qt SerialPort API和多线程编程,可以实现一个可以同时进行串口通信和其他操作的应用程序。多线程可以提高程序的响应速度和实时性,同时兼顾其他部分的功能。 ### 回答3: Qt SerialPort API是一个用于在Qt应用程序中进行串口通信的API。它提供了许多用于配置串口参数、读数据等功能的类和方法,使得开发者可以轻松地与外部设备进行串口通信。 要编一个多线程的应用程序,可以使用Qt的多线程功能。多线程可以使应用程序能够同时执行多个任务,从而提高程序的性能和响应能力。 首先,我们可以创建一个继承自QThread的自定义线程类,在这个类中实现串口通信的功能。在这个类的run()方法中,可以编与外部设备进行通信的代码,包括打开串口、设置串口参数、读串口数据等操作。 在主线程中,我们可以创建多个自定义线程对象,并调用它们的start()方法来启动它们。每个线程都会在自己的run()方法中执行与外部设备的通信操作,从而实现多个串口的并行通信。 在多线程应用程序中,需要注意对共享资源的访问进行同步处理,以避免数据竞争和线程冲突的问题。可以使用Qt提供的线程同步机制,如互斥锁、条件变量等来进行资源的互斥访问和线程间的同步通信。 总结来说,使用Qt SerialPort API编一个多线程应用程序,首先需要创建一个自定义线程类,在其中实现串口通信的功能。然后,在主线程中创建多个线程对象,并启动它们。最后,确保对共享资源的访问进行同步处理,以保证多线程程序的正确和稳定运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值