zoukankan      html  css  js  c++  java
  • qt学习

    QT学习

    QT是一个跨平台的C++图形用户界面应用程序框架。提供建立艺术级图形界面所需的所有功能。完全面向对象的,很容易扩展,并且允许真正的组件编程。

    1.创建第一个QT程序


    QWidget功能最简单

    main.cpp

    #include "mywidget.h"
    #include <QApplication>//包含一个应用程序类的头文件
    
    //main函数入口 argc命令行变量的数量  argv命令行变量的数组
    int main(int argc, char *argv[])
    {
        //a应用程序对象,在QT中,应用程序对象,有且仅有一个
        QApplication a(argc, argv);
        //w窗口对象 myWidget父类->QWidget
        myWidget w;
        //窗口对象 默认不会显示 必须要调用show方法显示窗口
        w.show();
        
        //让应用程序对象进入消息循环
        //让代码阻塞到这行
        return a.exec();
    }
    

    .pro文件

    #-------------------------------------------------
    #
    # Project created by QtCreator 2021-02-06T11:16:00
    #
    #-------------------------------------------------
    
    QT       += core gui  //QT包含的模块
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  //大于4版本以上 包含widget模块
    
    TARGET = 01_project  //目标 生成的.exe名称
    TEMPLATE = app       //模块 应用程序模板
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which has been marked as deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    CONFIG += c++11
    
    SOURCES +=             //源文件
            main.cpp 
            mywidget.cpp
    
    HEADERS +=              //头文件
            mywidget.h
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    

    mywidget.h

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>//包含头文件 QWidget窗口类
    
    class myWidget : public QWidget
    {
        Q_OBJECT   //宏 允许类中使用信号和槽的机制
    
    public:
        myWidget(QWidget *parent = 0);//构造函数
        ~myWidget();//析构函数
    };
    
    #endif // MYWIDGET_H
    

    2.QPushButton创建

    第一个按钮

    首先添加一个头文件

    new一个按钮,并让按钮显示在widget上

    可得到如下一个按钮

    添加文本

    第二个按钮

    第二种方式创建按钮

    按照控件的大小创建窗口

    第二个创建的会将第一个覆盖,所以要移动

    固定窗口大小以及修改窗口名字

    3.对象树

    当创建的对象在堆区域的时候,如果指定的父亲是QObject派生下来的类或者QObject的子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。一定程度上简化了内存回收机制。

    验证类的释放操作

    新建一个文件

    更改成QPushButton为父类:

    cpp文件

    #include "mypushbutton.h"
    #include <QDebug>
    
    MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
    {
        qDebug()<<"我的按钮类构造调用";
    }
    
    MyPushButton::~MyPushButton()
    {
        qDebug()<<"我的按钮类析构";
    }
    

    h文件

    #ifndef MYPUSHBUTTON_H
    #define MYPUSHBUTTON_H
    
    #include <QPushButton>
    
    class MyPushButton : public QPushButton
    {
        Q_OBJECT
    public:
        explicit MyPushButton(QWidget *parent = nullptr);
    
        ~MyPushButton();
    
    signals:
    
    public slots:
    };
    
    #endif // MYPUSHBUTTON_H
    

    可以看出析构函数可以在关闭窗口时被自动执行

    4.QT中的坐标系

    以左上角为原点(0,0),X向右增加,Y向下增加。

    对于嵌套窗口,其坐标是相对于父窗口而言的。

    5.信号和槽

    提出需求:点击“我自己的按钮”,关闭窗口

    connect(myBtn,&QPushButton::clicked,this,&myWidget::close);
    参数1 信号的发送者
    参数2 发送的信号(函数的地址)
    参数3 信号的接收者
    参数4 处理的槽函数(函数的地址)

    5.自定义的信号和槽

    需求:

    设置一个Teacher 老师类 Student 学生类
    下课后,老师会触发一个饿了信号,学生响应信号,请客吃饭

    添加两个文件

    teacher.h

    signals:
        //自定义信号  写到signals下
        //返回值是void,只需要声明,不需要实现
        //可以有参数,可以重载
        void hungry();
    

    student.h

    public slots:
        //返回值void,需要声明,也需要实现
        //可以有参数,可以发生重载
        void treat();
    

    student.cpp

    void Student::treat()
    {
        qDebug()<<"吃饭";
    }
    

    widget.cpp

    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        //创建一个老师对象
        this->zt=new Teacher(this);
    
        //创建一个学生对象
        this->st=new Student(this);
    
        //连接
        connect(zt,&Teacher::hungry,st,&Student::treat);
        classisover();
    }
    void Widget::classisover()
    {
        emit zt->hungry();
    }
    
  • 相关阅读:
    C# 直接选择排序(史上最清晰,最通俗)
    Hadoop单节点伪分布式环境部署
    Hive安装和部署andMySQL安装和部署
    Kafka集群部署
    HA Hadoop完全分布式环境部署
    HBase集群部署
    Flume整合Kafka
    Hadoop完全分布式环境部署
    JavaScript正则表达式语法
    什么无线路由器性价高?买什么路由器好?
  • 原文地址:https://www.cnblogs.com/hyuxin/p/14486829.html
Copyright © 2011-2022 走看看