Qt小知识点总结

    • 构造函数用于对象定义一瞬间的初始化,因此可以在窗口的构造函数中设置窗口属性

    • 初始化列表的目的:给基类构造传递参数

    • 只要是从Object派生的对象,那么构造时指定父对象,new出来的内存会被系统自动回收

    • this指针在定义对象时和构造函数一同生成,因此可以在构造函数中使用this指针。this指针代指整个对象,要用->来访问成员变量或成员函数

    • c++中,类的对象在函数被执行完之后就会调用析构函数

    • 所有的Qt程序都要包含头文件QApplication,QApplication a(argc, argv);// QApplication是类

    a是对象,语句代表了QT框架初始化,这是整个Qt正常工作所必须的幕后主使,这个对象管理应用程序的资源,对于任何使用Qt
    Widgets的程序都是必须的

    • 宏Q_OBJECT :为了使用信号槽,必须继承QObject类,凡是QObject的子类或间接子类,都应在第一行的代码中写上Q——OBJECT

    • Widgets模块提供了一组UI元素用于创建经典的桌面风格的用户界面,Widgets是小控件的意思,Qt Widgets Application 称为Qt控件程序

    • return a.exec();//a就是Qt的框架对象 a.exec()作用是让程序不死,类似于while(1)循环 循环检测事件的产生

    • QWidget是所有控件的基类,也是能够在屏幕上显示的一切组件的父类,其就是一个窗口,Widget继承了QWidget,所以它也是窗口类,即一个窗口

    • 如果一个对象有父对象,在其析构的同时系统会自动的将其从父对象的孩子列表中删除,

    • 如何创建一个按钮?QPushButton是所有按钮的基类,因此创建按钮要引入头文件#include <QPushButton,如果没有给按钮指定父对象,那么其就和窗口分开显示。如果指定了父对象,父对象显示,按钮就会显示

    • 上一条的原因:Qt在创建对象的时候会提供一个父对象指针,所创建的对象会自动的添加到其父对象的children()列表,当父对象析构的时候,其children()列表的所有对象也会被析构(父对象并不是继承意义上的父类)

    • new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址

    • 信号和槽:某个事件发生(如按钮被按下)--------------就会产生一个信号,一个漫无目的的信号----------------有对象对该信号感兴趣,会使用connect函数将信号和自己的一个回调函数(槽)绑定起来,当信号产生后,就会自动执行回调函数。(用connect连接)

    • 信号和槽既可以用系统自带的,也可以是自定义的,信号函数和槽函数的返回值都是void类型的,即没有返回值,信号函数只需要声名不需要实现(其实是Qt自动帮我们实现了),槽函数既需要声名也需要实现,注意槽函数一定要是接收对象的槽函数。信号的本质就是一个函数

    • 函数指针:指向函数指针的一般定义形式为:数据类型 (*指针变量名)(参数表); 另外,函数名也是一个函数指针。 int max(int x, int y); //求最大数 int min(int x, int y); //求最小数 int

    add(int x, int y); //求和 void process(int i, int j, int (*p)(int a,
    int b)); //应用函数指针 void process(int i, int j, int (*p)(int a, int b))
    { cout<<p(i, j)<<endl; } int main() { int x, y; cin>>x>>y;
    process(x, y, min);-------------这里即:函数指针=函数名
    将函数min的入口地址赋给指针变量p,这时p也指向函数的起始地址 process(x, y,
    &add);------------强调的是要不要&都可以 return 0; }

    • 注:函数指针的定义: int (*p)(int)=&foo;以上的&符可以省略,编译器会把函数名转换为函数指针,加上&只是显示的说明了编译器将隐式执行的任务,函数指针的使用

    (*p)(10);p(10);以上两种均通过函数指针调用到foo函数 ,月也可以通过直接使用函数名调用foo(10);

    • Widget::close和 QWidget::close是一样的, Widget就继承了 QWidget,connect函数的用法为:connect(信号的发出者,信号发出者所属类下面的信号,接收者,接收者所属类下面的槽函数)

    • 自定义槽函数:槽函数可以是普通的成员函数、static函数、全局函数、和lambda表达式,槽函数应不应该有参数取决于信号,信号没有参数,则槽函数没有参数,如果信号有参数,那么槽函数参数可有可无。(具体原因就是程序在执行的过程中槽函数是在信号函数内部当做一个回调函数使用的)槽函数的参数允许比信号的参数少,但其顺序必须和信号中的参数顺序一一对应

    • 自定义信号:信号本质上也是一个函数,信号函数没有返回值,但可以有参数。信号函数不需要定义,只需要声明。

    • emit是Qt中的关键字,和其他Qt扩展一样,会被C++预处理器转换成标准的C++代码。它的定义为#define emit,也就是说emit仅仅就是个宏定义的符号,编译器宏替换后就是个空白,代码里有没有是一样的,之所以加上是为了让编程者知道这个定义是要发射信号了。

    • 定义信号使用Qt的signals关键字。注意信号没有访问权限,实际上它们都是受保护权限的,也就是说只有定义信号的类自己及派生类才能发射这个信号。信号一般定义为无返回值的函数,这个函数不需要实现(由moc工具自动生成的代码实现)

    • 执行信号的时候同时会把信号的参数发送给槽函数,槽函数会自动的接收,当然接不接收参数取决于槽函数,如果要接受则在槽函数定义的时候加上参数,即可自动的传进来。

    • 一个信号可以与多个槽函数相连,但调用的顺序不确定;多个信号可以连接到一个槽,只要任意一个信号发出,这个槽就会被调用;一个信号可以连接另外一个信号,即信号调用的槽函数里再发射一个信号;disconnect函数可以断开信号与槽。

    • lambda表达式用于定义并创建匿名的函数对象,以简化编程工作,格式如下:【】()mutable 或 exception 声明{}

    ,中括号是函数对象参数,常用的有以下几种形式:空–没有任何函数对象参数,=–表达式所在范围所有变量都值传递到lambda函数中,&–引用传递,小括号放信号传过来参数要接受的参数,大括号是函数体,如果要想对传进来的变量的值进行改变,就在大括号前+mutable,如果要想改变后原变量的值也改变,则需要将值传递改为引用传递,如果lambda表达式要返回值为int类型,则在mutable后加上->int,另外,Qt中lambda表达式的小括号一般不写东西,具体如下所示:
    在这里插入图片描述

    • 工具栏中的工具是菜单中菜单项的快捷方式。下图是关于菜单的一些基操:在这里插入图片描述

    • 不管是状态栏工具栏还是菜单栏,MainWindow里面都是自带的,要想显示出来必须执行相关的语句。

    • 在没有核心部件的情况下,浮动窗口会占据整个主窗口,在有核心部件的情况下,浮动窗口会围绕核心部件上、下、左、右停靠;

    • 将程序运行时需要的图片或其他资源直接编译到可执行文件当中,这样不用担心人为的删除。(将图片编译成资源文件放到可执行文件里面去,这样程序加载图片时加载的是可执行文件里面的资源文件),图片在添加文件时一定要放到项目文件夹下,放到build文件夹下就不行。在这里插入图片描述

    右键图片,选择复制资源路径到剪切板,以下是以上关于Qt的实现代码:

    #include "mainwindow.h"
    #include <QMenuBar>
    #include <QMenu>
    #include <QAction>
    #include <QToolBar>
    #include <QStatusBar>
    #include <QLabel>
    #include <QDockWidget>
    #include <QTextEdit>
    #include <QPixmap> MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent) {
          
          
        this->resize(600,400);
        //取出菜单栏】
        QMenuBar *menubar1 = this->menuBar();//取出菜单栏并返回地址
        //向菜单栏添加菜单  一般添加某个东西返回的都是地址
        QMenu *filemenu = menubar1->addMenu("文件");//添加菜单项并返回菜单地址  当然不要返回地址直接执行添加语句也可以
        menubar1->addMenu("编辑");
        //向菜单添加菜单项
        QAction *openaction = filemenu->addAction("打开");
        filemenu->addSeparator();//添加菜单项的分隔线
        QAction *saveaction = filemenu->addAction("保存");
    
        //取出工具栏
        QToolBar *toolbar = this->addToolBar("");
        //向工具栏中添加工具(添加菜单项的快捷方式)
        toolbar->addAction(openaction);
        toolbar->addSeparator();//添加分隔线
        toolbar->addAction(saveaction);
    
        //取出状态栏
        QStatusBar *status = this->statusBar();
        status->addWidget(new QLabel("状态"));//给状态栏添加控件
    
        //创建铆接部件(浮动窗口)
        QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件",this);
        this->addDockWidget(Qt::TopDockWidgetArea,dockwidget);//把创建好的浮动窗口添加到主窗口
    
        //创建核心部件
        QTextEdit *edit = new QTextEdit("文本编辑器",this);
        this->setCentralWidget(edit);//设置中心控件为编辑器
    
        //:/new/prefix1/ding.jpg
        QPixmap pic;//pic是一张图片,定义一个图片对象
        pic.load(":/new/prefix1/ding.jpg");
        openaction->setIcon(QIcon(pic));//QIcon(pic)是创建图标,用pic图片对象创建,setIcon是设置图标
    
    } ```
    
     - ### 对话框是GUI程序不可缺少的组成部分,很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置,对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。像主窗口一样,在Qt中通常会设计一个类继承QDialog(也是一个对话框类),所有对话框类的父对象指针都有额外的解释:如果parent为空则其是一个顶层窗口,否则作为其父组件的子对话框。对话框分为模态和非模态,模态对话框会阻塞,即弹出该对话框后会阻塞界面的其他操作,非模态则不阻塞。
     - ### Qt中的标准对话框是一系列通用的对话框,用于简洁开发,如打开文件,设置颜色,模态对话框等等。如下所示是打开文件对话框:   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118114000714.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    
     - ### 静态成员函数和类的实例化无关,不需要实例化类即可调用,对于同一类来说,静态成员函数是共享的。而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是自己独有的。
     - ### 模态对话框很简单,三句话就行,非模态和模态创建有一点区别,如下所示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118122034581.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    
     - ### 消息对话框QMessageBox用于显示消息提示,其有static函数和一些宏,这里列举两个常用类型的对话框: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118140117106.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    
     - ### 带UI的界面:创建项目的时候勾选UI即可,双击项目文件widget.ui即可。以下是关于带ui的程序说明,不必深究,但需了解。 
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118215028684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118215043354.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118215100309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    
     - ###  右键控件-->转到槽-->选择信号-->跳转到槽函数。没有调用connect去设置控件消息和槽函数的连接,是因为系统在ui_widget.h自动生成好了连接。
     - ### 相对路径:如果在Qt中运行,代码中的相对路径是makefile,如果手动运行,代码中的相对路径是可执行程序。因此给按钮添加图标时最好是用资源而不是文件。
     - ### 常用控件:1.QLabel:最常用的控件之一,可以用来显示文本,图片和动画。没有ui的项目在标签上设置文字和图片的代码如图: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210119111213989.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    
     - ### 关于强制类型转换:关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast,
    dynamic_cast。标准C++中有四个类型转换符:static_castdynamic_castreinterpret_cast、和const_cast。下面对static_cast进行介绍。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210119114715653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    
     - ### 如何自定义控件:先在项目里添加类,把自己的控件还有连接函数都做好,再在ui中添加widget,右键选择“提升为”,如图: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210119124931338.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzA4MjE3,size_16,color_FFFFFF,t_70)
    其中自定义控件示例代码如下:
    
    ```cpp
    #include "smallwidget.h"
    #include <QHBoxLayout> smallwidget::smallwidget(QWidget *parent) : QWidget(parent) {
          
          
        slider = new QSlider(Qt::Horizontal,this);//水平方向滑动条
        spin = new QSpinBox(this);//设置数值的控件
        QHBoxLayout *layout = new QHBoxLayout;//创建水平布局控件
        layout->addWidget(slider);
        layout->addWidget(spin);
        this->setLayout(layout);//给窗口添加布局
        connect(spin,static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
                slider,&QSlider::setValue
                );
        connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue
                    ); }
    
    
    • 关于定时器的简单使用: 在这里插入图片描述

    • 重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。隐藏:是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。重写:是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同,派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

    • Qt的绘图机制为屏幕显示和打印提供了统一的API接口,主要有三部分组成:QPainter类,QPaintDevice类和QPaintEngine类。QPainter类提供了画图操作的各种接口,可方便的绘制各种各样的图形,QPaintDevice类提供画图的空间和画图容器,主要用这两个类。Qt中所有的图都是画出来的,包括窗口,标签,按钮等,画图通常需要两个东西,一个画家(QPainter),一个画板(QPaintDevice,如常见的控件,按钮,窗口等),QPaintEngine起一个中间的通讯(翻译)作用,QPainter先画到内存上,QPaintEngine再翻译到画板上。

    在这里插入图片描述

    • 在这里插入图片描述

    • 在窗口部件第一次显示时,系统会自动调用绘图函数paintEvent(),如果需要自己绘图,则重写这个函数即可。 在这里插入图片描述

    画家可以自己画东西,同时也可以抓取各种各样的工具来画,set开头的函数都是抓取某种工具,定义工具后,画家就会由默认的工具转到用户定义的工具来画:
    在这里插入图片描述
    当然也可以打包绘制到pixmap中,最后在放到主窗口:
    在这里插入图片描述
    在这里插入图片描述

    • 实现鼠标按下画图,鼠标松开停止的代码,注:QVector是容器,里面装的是QPoint,updata()函数是更新界面,强制执行一次paintEvent事件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 内存文件的应用,使得很多时候传文件很方便: 在这里插入图片描述

    • TCP网络编程: 服务器: 在这里插入图片描述

    在这里插入图片描述

    • 导入动态链接库:VS下是要通过属性设置来导入,在Qt中,我们右键项目:添加库->外部库->将 .lib 拷贝到之前建立的qt工程的lib目录下,将.h文件拷贝到qt工程的include目录下,将.dll 拷贝到qt工程的

    bin目录下->包含目录就是头文件所在的目录,库文件则要一个一个的导入:
    在这里插入图片描述
    还要设置这个(bin文件夹一般用来存储可执行文件):
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42308217/article/details/112614673