【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】
【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】
- 1、前言
- 2、实验环境
- 3-1、学习链接-参考文章
- 3-2、先前了解-自我总结
- (1)线程处理逻辑事件,不能带有主窗口的事件
- (2)一般考虑使用的时候,是当你发现,主窗口会有卡顿,需要线程在后台来处理。
- (1)通过继承QOject类这种方式-特点。
- 4、实验过程
- (0)实验目标
- (1)新建工程
- (2)UI布局
- (3)线程类代码编写
- (4)编写mainwindow.cpp内容。
- 5-1、实际效果
- 5-2、代码链接
- 6、细节部分
- (1)同样的,main.cpp加入一段声明代码。
- 7、总结
1、前言
学习线程其实有一段时间了,当时只是学习,没有实际用起来,最近做的一个qt程序,发现如果不使用线程,那么就会导致界面卡死,这样才体现出线程的实际作用。
这里是第二章,第二种实现线程方式,这个还是和继承线程类的方式不太一样的,两种本身没有优劣之分,看你使用场景与习惯。
2、实验环境
实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样。
系统环境:window环境
QT软件版本:qt 5.14.2
ST-Link命令行工具的版本号:STM32 ST-LINK CLI v3.6.0.0
3-1、学习链接-参考文章
自己也是参考他人文章,通过学习他人的文章与视频学习了qt多线程,当然要说明出处。
如下是博客地址,里面相关概念总结:https://subingwen.cn/qt/thread/
如下是B站上视频,也是通过视频,敲的代码:https://www.bilibili.com/video/BV1iN411f7dY/?spm_id_from=333.337.search-card.all.click&vd_source=631b10b31b63df323bac39281ed4aff3
3-2、先前了解-自我总结
博客文章说得已经非常好了,自己也会重新总结下。
(1)线程处理逻辑事件,不能带有主窗口的事件
线程可以在后台辅助你,对一些数据进行除了,但是对于主界面的控件等,不能直接控制,从使用来说,
以下是一个例子,不能直接使用以下方式来调用界面的控件。
ui->label->setText("data");
当然是可以通过一些信号与槽,或者全局变量的方式来传递数据。
(2)一般考虑使用的时候,是当你发现,主窗口会有卡顿,需要线程在后台来处理。
自己本次使用的时候,是因为碰到st-link烧写,并且文件很大的时候,主界面会直接卡住,才考虑使用,而不要是为了使用而使用,当你觉得主界面太卡,并且可以放在后台执行的时候,那么你就可以开一个线程。
(1)通过继承QOject类这种方式-特点。
1、对比继承线程类方式,这种一个显著特定,没有run这个函数了,你自己写自定义函数,到时候直接调用就可以了。
2、编写自定义函数内容
我们很多时候,是先学习怎么去做,然后返回来在具体了解内部细节的。
4、实验过程
(0)实验目标
采用两种不同速度排序的方式,对一个乱序的数组进行排序,这个过程中,需要生产乱序数组,使用一个线程,两种排序需要使用两个线程,所有一种有3个线程。
(1)新建工程
新建工程,是qtk开始的步骤,至少先让你的空白模块跑起来,如下,这里就不过多叙述了(这里直接使用之前图片了)。
(2)UI布局
我们需要是三个框,也就是listWidget,分别放置三个数组,一个是乱序数组,另外两个是冒泡排序和快排,如下。
(3)线程类代码编写
本工程就不在分太多文件了,只是添加一个线程文件,将三个线程写在一起。
(1)添加新的文件,在项目上右键,然后选择“Add New…”
(2)添加新的C++文件,然后命名,
(3)这里可以先选上include QObject,细节代码,我们稍后添加。
(4)编写对于”mythread.h“和“mythread.cpp”内容。
我们需要继承QObject类,编写功能函数声明,自定义函数声明的,如下代码快,
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>
#include <QVector>
#include <QDebug>class myThread_rand : public QObject
{Q_OBJECT
public:explicit myThread_rand(QObject *parent = nullptr);void working(int num);signals:void sendArray(QVector<int> num);};class bubblesort_thread : public QObject
{Q_OBJECT
public:explicit bubblesort_thread(QObject *parent = nullptr);void working(QVector<int> list);signals:void finish(QVector<int> num);};class quickSort_thread : public QObject
{Q_OBJECT
public:explicit quickSort_thread(QObject *parent = nullptr);
//任务函数void working(QVector<int> list);signals:void finish(QVector<int> num);};#endif // MYTHREAD_H
“mythread.cpp”内容,主要是实现相应函数内容,具体实现内容,这里也直接给出代码块。
#include "mythread.h"
#include <QElapsedTimer>
#include <QThread>using namespace std;myThread_rand::myThread_rand(QObject *parent) : QObject(parent)
{}bubblesort_thread::bubblesort_thread(QObject *parent) : QObject(parent)
{}quickSort_thread::quickSort_thread(QObject *parent) : QObject(parent)
{}void myThread_rand::working(int num)
{qDebug() << "生成随机数的线程地址为:" << QThread::currentThread() << endl;QVector<int> list;QElapsedTimer time;time.start();for(int i=0;i<num;++i){list.push_back(qrand()%10000);}int milsec = time.elapsed();qDebug() << "生成" << num<< "个随机总数用时:"<< milsec <<"毫秒" <<endl;emit sendArray(list);
}void bubblesort_thread::working(QVector<int> list)
{qDebug() << "冒泡生成的线程地址为:" << QThread::currentThread() << endl;QElapsedTimer time;time.start();// QVector<int> list;int temp;for(int i=0;i<list.size();++i){for(int j=0;j<list.size()-i-1;++j){if(list[j]>list[j+1]){temp=list[j];list[j]=list[j+1];list[j+1]=temp;}}}int milsec = time.elapsed();qDebug() << "冒泡总数用时:"<< milsec <<"毫秒" <<endl;emit finish(list);
}void quickSort_thread::working(QVector<int> list)
{qDebug() << "快速排序的线程地址为:" << QThread::currentThread() << endl;QElapsedTimer time;time.start();// QVector<int> list;std::sort(list.begin(),list.end());int milsec = time.elapsed();qDebug() << "快速排序总数用时:"<< milsec <<"毫秒" <<endl;emit finish(list);
}
(4)编写mainwindow.cpp内容。
这里的工作,主要是创建子线程,并传递数据,具体可以直接参照代码。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include "mythread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1.创建子线程QThread* t1 = new QThread;QThread* t2 = new QThread;QThread* t3 = new QThread;//2.创建任务类的对象myThread_rand* gen = new myThread_rand;bubblesort_thread* bubble = new bubblesort_thread;quickSort_thread* quick = new quickSort_thread;//3.将任务对象转移到每个子线程中gen->moveToThread(t1);bubble->moveToThread(t2);quick->moveToThread(t3);//4 按下按键 启动随机数线程connect(ui->pushButton,&QPushButton::clicked,this,[=](){emit starting(10000);t1->start();});//5 连接到产生随机数据函数,开始产生随机数据connect(this,&MainWindow::starting,gen,&myThread_rand::working);connect(gen,&myThread_rand::sendArray,bubble,&bubblesort_thread::working);connect(gen,&myThread_rand::sendArray,quick,&quickSort_thread::working);connect(gen,&myThread_rand::sendArray,this,[=](QVector<int> list){t2->start();t3->start();for(int i=0;i<list.size();++i){ui->listWidget_rand->addItem(QString::number(list.at(i)));}});connect(bubble,&bubblesort_thread::finish,this,[=](QVector<int> list){for(int i=0;i<list.size();++i){ui->listWidget_bubblesort->addItem(QString::number(list.at(i)));}});connect(quick,&quickSort_thread::finish,this,[=](QVector<int> list){for(int i=0;i<list.size();++i){ui->listWidget_quicksort->addItem(QString::number(list.at(i)));}});
}MainWindow::~MainWindow()
{delete ui;
}
5-1、实际效果
实际效果如下,还是可以看到,不同算法,排序实际确实不是一样的。
5-2、代码链接
代码链接:https://download.csdn.net/download/qq_22146161/88245843
6、细节部分
(1)同样的,main.cpp加入一段声明代码。
根据博主说明,要在main.cpp加入一段声明代码,否则会有错误。
7、总结
这里只是实现不一样,所有文章很多部分和第一篇有些类似。后续会加入一篇讲解关于移植部分。
相关文章:
![](https://img-blog.csdnimg.cn/d623e0fa20ac4d0fbd520193366c7356.png)
【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】
【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】 1、前言2、实验环境3-1、学习链接-参考文章3-2、先前了解-自我总结(1)线程处理逻辑事件,不能带有主窗口的事件(2&…...
![](https://img-blog.csdnimg.cn/img_convert/0242f041a2ff316295bc6028cdb65c7c.png)
两款开箱即用的Live2d
目录 背景第一款:开箱即用的Live2d在vue项目中使用html页面使用在线预览依赖文件地址配置相关参数成员属性源码 模型下载 第二款:换装模型超多的Live2d在线预览代码示例源码 模型下载 背景 从第一次使用服务器建站已经三年多了,记得那是在2…...
![](https://img-blog.csdnimg.cn/6d974fa7b890401f9b77763fc93bc9ae.png)
LAMP架构详解+构建LAMP平台之Discuz论坛
LAMP架构详解构建LAMP平台之Discuz论坛 1、LAPM架构简介1.1动态资源与语言1.2LAPM架构得组成1.3LAPM架构说明1.4CGI和astcgi1.4.1CGI1.4.2fastcgi1.4.3CGI和fastcgi比较 2、搭建LAMP平台2.1编译安装apache httpd2.2编译安装mysql2.3编译安装php2.4安装论坛 1、LAPM架构简介 1.…...
![](https://img-blog.csdnimg.cn/img_convert/d664a2f87b855a6b7a5b54718db866eb.jpeg)
如何使用腾讯云服务器搭建网站?新手建站教程
使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网分享使用腾讯云服务器建站教程,新手站长搭…...
![](https://www.ngui.cc/images/no-images.jpg)
mybatis plus 控制台和日志文件中打印sql配置
1 控制台输出sql 配置mybatis-plus的日志实现类为StdOutImpl,该实现类中打印日志是通过System.out.println(s)的方式来打印日志的 mybatis-plus:configuration:log-impl: org.apache.imbatis.logging.stdout.StdOutImpl2 日志文件中写入sql 日志文件中输入sql需要…...
![](https://img-blog.csdnimg.cn/13c6dcef23bc4403bb7c33ab662bcf2f.png)
苍穹外卖总结
前言 1、软件开发流程 瀑布模型需求分析//需求规格说明书、产品原型↓ 设计 //UI设计、数据库设计、接口设计↓编码 //项目代码、单元测试↓ 测试 //测试用例、测试报告↓上线运维 //软件环境安装、配置第一阶段:需求分析需求规格说明书、产品原型一般来说…...
![](https://www.ngui.cc/images/no-images.jpg)
Git 删除已经合并的本地分支
在使用 Git 的开发流程中,经常会创建很多的 Git 分支,包括功能分支(features/*)、发布分支(release/*)和 hotfix 分支(hotfix/*)。在开发了一段时间之后,本地就会有出现很…...
![](https://huaizhihua.oss-cn-beijing.aliyuncs.com/img/image-20230724110738929.png)
递归算法应用(Python版)
文章目录 递归递归定义递归调用的实现递归应用数列求和任意进制转换汉诺塔探索迷宫找零兑换-递归找零兑换-动态规划 递归可视化简单螺旋图分形树:自相似递归图像谢尔宾斯基三角 分治策略优化问题和贪心策略 递归 递归定义 递归是一种解决问题的方法,其精…...
![](https://img-blog.csdnimg.cn/img_convert/15c6b35996cfa2d8ba8fb652a7c5c2d7.png)
有什么react进阶的项目推荐的?
前言 整理了一些react相关的项目,可以选择自己需要的练习,希望对你有帮助~ 1.ant-design Star:87.1k 阿里开源的react项目,作为一个UI库,省去重复造轮子的时间 仓库地址:https://github.com/ant-design/…...
![](https://img-blog.csdnimg.cn/f162f09e9fef4237b9916d10e67339b3.gif#pic_center)
基于串口透传模块,单片机无线串口空中下载测试
基于串口透传模块,单片机无线串口空中下载测试 ✨无线串口下载,其本质还是串口下载方式,只不过省去了单片机和ISP上位机工具之间的物理有线连接,中间的数据通过无线串口透传模块进行数据中转,传递到单片机串口上。串口…...
![](https://img-blog.csdnimg.cn/b2d060f43e3b40619feb7fa7dc9dfccb.png)
研磨设计模式day11代理模式
目录 场景 代码实现 编辑 解析 定义 代理模式调用示意图 代理模式的特点 本质 编辑何时选用 场景 我有一个订单类,包含订单数、用户名和商品名,有一个订单接口包含了对订单类的getter和setter 现在有一个需求,a创建的订单只…...
![](https://img-blog.csdnimg.cn/3d76ddcd304c4c57a206739f6bae7929.png)
vue2 路由进阶,VueCli 自定义创建项目
一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!! 2.解决方案 vue-router 提供了一个全局组件 router…...
![](https://img-blog.csdnimg.cn/d74d3690f70449328907f31bef7519ec.png)
《C语言编程环境搭建》工欲善其事 必先利其器
C语言编译器 GCC 系列 GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,常被认为是跨平台编译器的事实标准。原名是:GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 ,…...
![](https://img-blog.csdnimg.cn/img_convert/fcab27442df877e4a862a8698f27beec.webp?x-oss-process=image/format,png)
蓝蓝设计ui设计公司作品案例-中节能现金流抗压测试软件交互及界面设计
中国节能是以节能环保为主业的中央企业。中国节能以生态文明建设为己任,长期致力于让天更蓝、山更绿、水更清,让生活更美好。经过多年发展,中国节能已构建起以节能、环保、清洁能源、健康和节能环保综合服务为主业的41产业格局,成…...
![](https://img-blog.csdnimg.cn/acbbf3a755774c54b93d172a693d7173.jpeg)
汽车制造业外发文件时 如何阻断泄密风险?
汽车制造业是我国国民经济发展的支柱产业之一,具有产业链长、关联度高、就业面广、消费拉动大等特性。汽车制造行业景气度与宏观经济、居民收入水平和固定资产投资密切相关。 汽车制造业产业链长,关联度高,汽车制造上游行业主要为钢铁、化工…...
![](https://img-blog.csdnimg.cn/a04a286764814986a179a6ea4a30b0cb.png)
怎么对App进行功能测试
测试人员常被看作是bug的寻找者,但你曾想过他们实际是如何开展测试的吗?你是否好奇他们究竟都做些什么,以及他们如何在一个典型的技术项目中体现价值?本文将带你经历测试人员的思维过程,探讨他们测试app时的各种考虑. …...
![](https://www.ngui.cc/images/no-images.jpg)
数字流的秩、单词频率(哈希实现)
题目1:数字流的秩 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入一个数字都会调用该方法…...
![](https://img-blog.csdnimg.cn/4f2aa1fa4b194a71a9900b355a86f778.png)
【洛谷】P2678 跳石头
原题链接:https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。(使用二分需要满足两个条件。一个是有界,一个是单调。 这题的题面:使得选手们在比赛过程中…...
![](https://img-blog.csdnimg.cn/ee75fbdb708447de99d8fbce657f7191.png)
Elasticsearch配置优化
以下的优化基础是安装的 Elasticsearch 版本为 7.17.7,同时jdk版本为 1.8.321 1、jvm参数优化 这里说的jvm参数调优,是指elasticsearch安装目录下的jvm.options配置,如下图所示: 这里调整的内容主要是调整垃圾回收的收集器&#…...
![](https://www.ngui.cc/images/no-images.jpg)
Springboot整合minio组件-分布式文件存储
一、快速开始 Minlo说明: Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。Minio主要用来存储非结构化的数据,类似文件,图片,照…...
![](https://img-blog.csdnimg.cn/096fa65e952845bd97c4cb7c928189fd.png#pic_center)
多态/虚函数/虚函数表
OVERVIEW 多态/虚函数/虚函数表1.虚函数引入后类发生的变化?2.虚函数表的生成时机和生成原因?3.虚函数表指针赋值的时机?4.类对象在内存中的布局?5.虚函数的工作原理和多态性的体现?6.其他问题 多态/虚函数/虚函数表 n…...
![](https://img-blog.csdnimg.cn/c3b13ccd6dd0439ebfaecb1f067c6432.png)
QT中按钮的基类QAbstractButton
QT中按钮的基类QAbstractButton 关于控件类的学习方法继承关系信号槽函数标题和图标按钮的 Check 属性 关于控件类的学习方法 控件类很多,API更多,但是不需要记忆知道控件对应的类名,通过帮助文档随用随查优先看帮助文档中控件对应的信号和槽…...
![](https://www.ngui.cc/images/no-images.jpg)
并查集(种类并查集,带权并查集)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都…...
![](https://img-blog.csdnimg.cn/98ff838d61b3464aa435015841b1b345.png)
飞天使-k8s基础组件分析-控制器
文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说,一个ReplicationCo…...
![](https://img-blog.csdnimg.cn/img_convert/116f6a7d7187c400680a8d09529ad724.png)
有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南
随着我国能源战略发展以及低碳行动的实施,电动汽车已逐步广泛应用,而电动汽车的应用非常符合当今社会对环保意识的要求,以及有效节省化石燃料的消耗。 由于其没有污染排放的优点以及政府部门的关注,电动汽车将成为以后出行的重要…...
![](https://img-blog.csdnimg.cn/img_convert/248851e1af6a607fc77a58c6c55c4431.png#pic_center)
LeetCode-227-基本计算器Ⅱ
题目描述: 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计…...
![](https://www.ngui.cc/images/no-images.jpg)
dart 学习列表 List
List 列表 在 Dart 编程语言中,List 是一种有序的集合数据类型,用于存储一系列项目。它允许您在单个变量中存储多个项目,并提供了许多操作来管理列表中的数据。以下是关于 Dart 中的 List 的一些重要信息: 创建 List: …...
![](https://img-blog.csdnimg.cn/dd1df916616545f3be9266342b27779d.png)
数据结构--树4.2.1(二叉树)
目录 一、二叉树的存储结构 二、二叉树的遍历 一、二叉树的存储结构 顺序存储结构:二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点,并且结点的存储位置能体现结点之间的逻辑关系。 链式存储结构:二叉树每个结点最多只有两个孩…...
![](https://img-blog.csdnimg.cn/0990481cd85a4b79b8ebdae18b828b10.png)
Presto之Driver个数
一. 前言 在Presto的Stage Performace中,每个Operator中都会有Driver个数的显示,如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。 二. Driver个数 在Presto中,一个pipeline中启动多少个Driver,是由此Pipeline处理的S…...
![](https://csdnimg.cn/release/phoenix/outside_default.png)
R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化
全文链接:https://tecdat.cn/?p33499 响应面(Response Surface Methodology,RSM)分析是一种常用的统计方法,用于研究和优化生产过程中的影响因素。通过建立数学模型来描述因素与响应之间的关系,RSM可以帮助…...
![](https://img-blog.csdnimg.cn/20201221171900930.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0phY2tpZURZSA==,size_16,color_FFFFFF,t_70)
农业部工程建设服务中心网站/百度搜索流量查询
A、 B 、 C 是 3 个字符串。把 A 中包含的所有 B 都替换为 C ,如果替换以后还有 B 就继续替换,直到 A 不包含 B 为止。 1、请编写程序实现以上功能。不允许使用系统提供的字符串比较、查找和替换函数。 js版代码实现let a1 aaabbbcccbbbffbbb; let b1 …...
![](/images/no-images.jpg)
网站上怎么做浮标/收录网
所有常见证书处理函数的实现 // 转换私钥编码格式BOOL ConvertKeyFormat(char *oldKey,int oldKeyLen,int oldFormat,char *newKeyFile,int newFormat){EVP_PKEY *keyNULL;BIO *bioutNULL;int ret;if ((bioutBIO_new_file(newKeyFile, "w")) NULL)return false;ke…...
![](/images/no-images.jpg)
wordpress 换域名/西安seo站内优化
题目来源:赛码网http://exercise.acmcoder.com/online/online_judge_list /*************************************************************** 题目描述:股神 有股神吗?有,小赛就是!经过严密的计算,小赛买…...
![](https://static.leiphone.com/uploads/new/article/740_740/201803/5aa721fcd910d.png?imageMogr2/format/jpg/quality/90)
成都公司网页制作/seo高级优化技巧
https://www.leiphone.com/news/201803/Tw0nrq6vGDIvbmXr.html 雷锋网(公众号:雷锋网)获悉,3月13日,东芝发布新AR眼镜dynaEdge AR,其由一个单臂眼镜和一个分离的计算单元组成。眼镜售价1899美元,面向企业级用户。 当所…...
![](https://img-blog.csdnimg.cn/img_convert/7f913e96a023df7f8a9b92dfcf890937.png)
安徽政府网站建设管理/进入百度app查看
本文来自 威锋网 ,作者 乔纳森森森 iOS 15 为许多系统应用程序和功能提供了新的小组件。用户可以轻松地通过上下滚动以查看选定的小组件、重新排列它们或将它们从堆栈中删除。堆栈还有另外两个选项:智能旋转的打开与关闭,小组件建议的开启与…...
![](https://images2018.cnblogs.com/blog/1303036/201805/1303036-20180531140427161-656380043.jpg)
晚上必看的正能量网站/seo查询工具网站
①定义 "group by" 从字面上理解是根据“by"指定的规则对数据进行分组 ②简单示例 ③group by 中的select字段是受限制的 select指定的字段要么作为分组的依据,要么包含在聚合函数中,否则就报错。 ④支持多列分组group by all ⑤group by…...