-
2019-07-21 17:23:05
1.第一种方法 ///首先在头文件中定义 private slots: void show_l(); ///在.cpp中进行connect QtGuiApplication3::QtGuiApplication3(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); connect(ui.pushButton, &QPushButton::clicked, this, &QtGuiApplication3::show_l); //第一变量是按钮名,第二个变量是发射的信号,第三个变量接受信号的对象,第四个变量是执行的槽,也就是函数。 } 2.第二种方法(不需要connect函数连接) ///首先在头文件中定义------声明必须是::字符on+发射信号的部件对象名+信号名(下划线) private slots: void on_pushButton_clicked(); / //不用修改 QtGuiApplication3::QtGuiApplication3(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); } 定义函数即可 void QtGuiApplication3::on_pushButton_clicked() { QDialog *dialog = new QDialog(this); dialog->show(); } 3.第三种方法(是第一种的变形) ///首先在头文件中定义一个函数 private: void Imc_Total(); //调用函数 QtGuiApplication3::QtGuiApplication3(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); Imc_Total(); } //编写函数并connect void QtGuiApplication3::Imc_Total() { // 打开一个文件 QObject::connect(ui.pushButton, &QPushButton::pressed, [this]() { //在这里编写需要执行的命令 }); //可以写多个connect }
更多相关内容 -
Qt 多个按钮关联同一个槽函数实现不同操作 两种方法
2020-10-13 17:01:54界面包含多个按钮,每个按钮实现相同的功能,但是操作的对象不同,例如点击按钮清除对应输入框内容,可以用多个按钮关联同一个槽函数,然后通过槽函数来控制不同按钮操作不同输入框,查到有两种方法可以使用,分别...
前言
界面包含多个按钮,每个按钮实现相同的功能,但是操作的对象不同,例如点击按钮清除对应输入框内容,可以用多个按钮关联同一个槽函数,然后通过槽函数来控制不同按钮操作不同输入框,查到有两种方法可以使用,分别编写了两个方法的代码如下。
方法一 :ObjectName
通过setObjectName()在定义button处先设置ObjectName,后在槽函数中判断信号的名称。可实现清除对应输入框功能。
mybutton.h
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QWidget> #include <QPushButton> #include <QLineEdit> namespace Ui { class MyButton; } class MyButton : public QWidget { Q_OBJECT public: explicit MyButton(QWidget *parent = 0); ~MyButton(); private: Ui::MyButton *ui; QPushButton *clearBtn[6]; QLineEdit *edit[6]; private slots: void buttonClicked(); }; #endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h" #include "ui_mybutton.h" #include <QPushButton> #include <QVBoxLayout> #include <QDebug> #include <QLineEdit> MyButton::MyButton(QWidget *parent) : QWidget(parent), ui(new Ui::MyButton) { ui->setupUi(this); QVBoxLayout* buttonLayout = new QVBoxLayout(this); for(int i=0;i<6;i++) { edit[i] = new QLineEdit(); clearBtn[i] = new QPushButton("clear"+QString::number(i)); clearBtn[i]->setObjectName("button"+QString::number(i)); //设置名称 buttonLayout->addWidget(edit[i]); buttonLayout->addWidget(clearBtn[i]); connect(clearBtn[i],SIGNAL(clicked(bool)),this,SLOT(buttonClicked())); } } MyButton::~MyButton() { delete ui; } void MyButton::buttonClicked() { QString btnName = QObject::sender()->objectName(); int index = (btnName.mid(6,-1)).toInt(); switch(index) { case 0: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 1: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 2: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 3: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 4: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 5: qDebug()<<"button:"<<index; edit[index]->clear(); break; default: qDebug()<<"button"; break; } }
方法二 :QSignalMapper
通过QSignalMapper类中setMapping()将特定的字符串或整型数对应到特定的对象上,该特定对象的signal可以被连接到QSignalMapper的map() slot,而map()会发射带参数mapped() signal,参数就是signal的特定对象的标识信息,下面的代码以整型为例,作为参数。
mybutton.h:
#ifndef MYBUTTON_1_H #define MYBUTTON_1_H #include <QWidget> #include <QPushButton> #include <QLineEdit> namespace Ui { class myButton_1; } class myButton_1 : public QWidget { Q_OBJECT public: explicit myButton_1(QWidget *parent = 0); ~myButton_1(); private: Ui::myButton_1 *ui; QPushButton *clearBtn[6]; QLineEdit *edit[6]; private slots: void buttonClicked(int index); }; #endif // MYBUTTON_1_H
mybutton.cpp:
#include "mybutton_1.h" #include "ui_mybutton_1.h" #include <QSignalMapper> #include <QPushButton> #include <QVBoxLayout> #include <QDebug> #include <QLineEdit> myButton_1::myButton_1(QWidget *parent) : QWidget(parent), ui(new Ui::myButton_1) { ui->setupUi(this); QVBoxLayout* buttonLayout = new QVBoxLayout(this); QSignalMapper* mapper = new QSignalMapper(this); for(int i=0;i<6;i++) { edit[i] = new QLineEdit(); clearBtn[i] = new QPushButton("clear"+QString::number(i)); buttonLayout->addWidget(edit[i]); buttonLayout->addWidget(clearBtn[i]); mapper->setMapping(clearBtn[i],i); connect(clearBtn[i],SIGNAL(clicked()),mapper,SLOT(map())); } connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int))); } myButton_1::~myButton_1() { delete ui; } void myButton_1::buttonClicked(int index) { switch(index) { case 0: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 1: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 2: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 3: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 4: qDebug()<<"button:"<<index; edit[index]->clear(); break; case 5: qDebug()<<"button:"<<index; edit[index]->clear(); break; default: qDebug()<<"button"; break; } }
运行
参考文章 (https://blog.csdn.net/u014339020/article/details/81016424) -
C++类中的构造函数和赋值函数
2020-05-30 17:20:17构造函数主要包括:默认构造函数、带参构造函数、拷贝构造函数三种,且构造函数经常与赋值函数混淆,这里放在一起讲,便于区分。 首先初始化一个简单的类作为例子讲解: class A { public: A() { v = 1; printf...C++类中的构造函数和赋值函数
构造函数主要包括:默认构造函数、普通构造函数、拷贝构造函数三种。
构造函数经常与赋值函数混淆,这里放在一起讲,便于区分。首先初始化一个简单的类作为例子讲解:
class A { public: A() { v = 1; printf("默认构造(无参数)\n"); } A(int t = 1) { v = 1; printf("默认构造(有参数,且参数有默认值)\n"); } A(int t) { v = t; printf("普通构造1\n"); } A(int t,int f) { v = t; m = f; printf("普通构造2\n"); } //默认构造函数只能有一个,当有参默认构造函数的参数列表与普通构造函数的参数列表一样时,两者也只能存在一个。 A(const A& a) { this->v = a.v; printf("拷贝构造\n"); } A& operator= ( A& a) { this->v = a.v; printf("赋值函数\n"); return *this; } ~A() { printf("析构函数\n"); } int v; int m; };
1、 默认构造函数
①准确的说,默认构造函数就是在调用时不需要显示地传入实参的构造函数。
②一个类只能有一个默认构造函数。1.1、默认构造函数
当类中没有定义任何构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。
此外,用户可自定义默认构造函数如下。实现形式:
A() { //可以为空,为空则与编译器生成的默认构造函数相同 } A(int t = 1) { v = t; }
上述两种默认构造函数不能同时存在,否则在调用默认构造函数时会引起二义性。
调用形式:
int main() { A a;//默认构造函数 return 0; }
*C++构造函数重载以及默认参数引起的二义性
问题解析
当我们同时定义一个带默认参数的默认构造函数和一个不带参数的默认构造函数之后(一般不这样做,两种构造函数不应被同时定义),在定义一个类对象时,如果不传递参数,会出现二义性错误。因为我们没有传递参数时,系统默认又两种选择,一种是调用无参的默认构造函数,另一种是调用带参默认构造函数并传递默认参数。
class A { public: A() { v = 0; } A(int r = 0) { v = r; } int v; }; int main() { A c;//error: call of overloaded ‘Complex()’ is ambiguous return 0; }
会报错:error: call of overloaded ‘Complex()’ is ambiguous
解决方法
1.去掉无参默认构造函数。
class A { public: A(int r = 0) { v = r; } int v; };
这时,当我们不给构造函数传递参数时,系统会调用有参默认构造函数并传递默认参数对类数据成员进行初始化。
int main() { A a; //相当于 A a(0);//有参默认构造函数 return 0; }
2.去掉带参默认构造函数的默认参数
class A { public: A() { v = 0; } A(int r) //去掉带参构造函数的默认参数 { v = r; } int v; };
此时带参默认构造函数就变成了普通构造函数。
1.2、默认拷贝构造函数
当类中没有定义任何拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值的赋值。这里涉及到深拷贝和浅拷贝的知识,将在拷贝构造函数小节详述。
2、 普通构造函数
实现形式:
//通过参数列表的不同进行重载 A(int t) { v = t; } A(int t,int f) { v = t; m = f; } A(int t): v(a) {}//普通构造函数1的参数列表形式 A(int t,int f): v(a), m(f) {}//普通构造函数2的参数列表形式
调用形式:
int main() { A a(1);//普通构造函数1 A a(1,1);//普通构造函数2 return 0; }
3、 拷贝构造函数(复制构造函数)
实现形式:
A(const A& a) { this->v = a.v; printf("拷贝构造\n"); }
调用形式(三种情况):
3.1、对象需要通过另一个对象进行初始化
int main() { A a(1); A b = a;//拷贝构造函数形式一 A c(a);//拷贝构造函数形式二,最好写成这种形式 return 0; }
3.2、对象通过值传递方式进入函数
void g(A ret) { printf("函数作为参数\n"); } int main() { A a(1); g(a);//作为参数传入函数时调用拷贝构造函数 return 0; }
3.3、对象以值传递方式从函数返回
A f() { A ret(3); return ret; } int main() { A a(1); A b = f();//以值传递方式从函数返回时调用拷贝构造函数 return 0; }
*关于深拷贝与浅拷贝
浅拷贝,即在定义一个类A,使用类似A obj; A obj1(obj);或者A obj1 = obj; 时候,由于没有自定义拷贝构造函数,C++编译器自动会产生一个默认的拷贝构造函数。这个默认的拷贝构造函数采用的是“位拷贝”(浅拷贝),而非“值拷贝”(深拷贝)的方式,如果类中含有指针变量,默认的拷贝构造函数必定出错。
浅拷贝
浅拷贝:也就是在对象复制时,只是对对象中的数据成员进行简单的赋值,如果对象中存在动态成员,即指针,浅拷贝就会出现问题,下面代码:
class A { public: A() // 构造函数,p指向堆中分配的一空间 { m_data = new char(100); printf("默认构造函数\n"); } ~A() // 析构函数,释放动态分配的空间 { if (m_data != NULL) { delete m_data; m_data = NULL; printf("析构函数\n"); } } private: char* m_data; // 一指针成员 }; int main() { A a; A b(a); // 拷贝构造 return 0; }
分析:由于没有拷贝构造函数,走编译器默认的拷贝构造函数,A b(a); 进行对象析构时,会造成释放同一内存空间2次。
深拷贝
对于深拷贝,针对成员变量存在指针的情况,不仅仅是简单的指针赋值,而是重新分配内存空间,如下:
class A { public: A() // 构造函数,p指向堆中分配的一空间 { m_pdata = new char(100); printf("默认构造函数\n"); } A(const A& r) { m_pdata = new char(100); // 为新对象重新动态分配空间 memcpy(m_pdata, r.m_pdata, strlen(r.m_pdata)); printf("深拷贝构造函数\n"); } ~A() // 析构函数,释放动态分配的空间 { if (m_pdata != NULL) { delete m_pdata; printf("析构函数\n"); } } private: char* m_pdata; // 一指针成员 }; int main() { A a; A b(a); // 拷贝构造 return 0; }
4、 赋值函数
赋值函数不属于构造函数,它是“=”运算符的重载函数。只有两个已经声明的对象之间(两个已经在内存中存在的对象)才能进行赋值。
实现形式:A& operator= ( A& a) { if (this != &a) { this->v = a.v; } printf("赋值函数\n"); return *this; }
①返回类型为自身类的引用,使得赋值函数可以联等赋值。
A t2,t3; t2=t3=t1;//假设t1是已被初始化的对象
②形参为类的引用,可以避免重复调用拷贝构造函数,const可以保护传入对象自身的安全。
调用形式:
int main() { A a(1); A b; b = a;//赋值函数 return 0; }
5、string类各种初始化时所调用的构造函数
//初始化方法1 string a;//调用无参默认构造函数,初始化后对象a内的字符串成员为空。 //初始化方法2 string a = "abc";//先调用普通构造函数生成一个匿名string对象,再调用拷贝构造函数把匿名对象拷贝给a。 //该语句等同于: string a(string("abc")); //初始化方法3 string a("abc");//调用普通构造函数 //初始化方法4 string a(b);//调用拷贝构造函数 //初始化方法5 string a = b;//调用拷贝构造函数 //方法6 (a,b已初始化) a = b;//调用赋值函数
-
类与类的几种关联模式的讲解
2019-02-19 23:17:03一般来说类与类有六种关联方式:单向关联,双向关联,自关联,多重性关联,聚合关系,组合关系。 1.单向关联一般是把B类作为A类的一个属性来实用,例如Company是一个类,Employee是一个类。然而Company类将Employee...一般来说类与类有六种关联方式:单向关联,双向关联,自关联,多重性关联,聚合关系,组合关系。
1.单向关联一般是把B类作为A类的一个属性来实用,例如Company是一个类,Employee是一个类。然而Company类将Employee作为其的一个属性。
2.双向关联,就是说将对方(类)当做自己的一个属性。例如顾客与商品的关系,顾客购买商品,卖出的商品与某个顾客关联。
3.自关联的比如链表中的节点,可以指向自己,把自己当做自己类的一个属性。
4.多重性关联,即A类把多个B类当做属性。
5.聚合关系,这是表示整体与部分之间的关系,成员对象是整体对象的一部分,但成员对象时可以脱离整体对象存在的
一个不恰当的例子是,一个三口家庭是由父亲,母亲,儿子存在组成整体部分的,但是父亲是可以可以脱离整体部分存在的。(不是很恰当的举例),两者关系较弱,通过对象注入实现。
6.组合关系,也是表示整体与部分之间的关系,但是部分不能脱离整体存在,整体没了它就没了。例如腾讯与QQ的关系,没了腾讯这家公司,QQ软件也没了。两者关系较强,通过构造函数实例化来实现。
-
【数据分析之EXCEL篇】6个常见的关联匹配函数
2020-03-02 15:31:37VLOOKUP函数 功能:按列查找 语法格式:=VLOOKUP(查找目标,查找范围,返回值的列数,精确or 模糊查找) 查找方式有2种: 精确查找:0或FALSE 模糊查找:1或TRUE 查询方式 (1) 单条件查询(使用单个... -
在Android 中 动态注册 JNI 函数
2022-03-22 16:14:54在Android 中 动态注册 JNI 函数 -
注册JNI函数的两种方式
2016-08-28 19:48:15注册JNI函数是两种方式 -
Qt信号槽不能响应信号的原因以及connect函数的两种关联方式
2020-11-30 15:21:011、类没有声明Q_OBJECT; 2、信号槽没有定义为pubic/private slots; 3、事件被子控件过滤掉了。比如QListWidget,当QListWidgetItem已经处理keypress事件后,QListWidget就不能响应itemDoubleClicked事件了。 4、信号... -
三元函数(三元函数能几何表示吗)
2021-02-05 02:49:37三元函数可是用二元函数来表示比方说f(x,y,z)=g(x,y)+g(y,z)+g(x,z),但是二元函数是在平面坐标系中表现的,而三元函数就是三维坐标系,这样看在三维坐标系中画一个向.那么三元函数表示有什么几何空间意义呢,那么四... -
【QT】多个信号 关联 同一个 槽函数
2018-07-12 15:39:01背景:多个信号需要执行同一个函数或者一类函数的时候,可以选择每个信号创建一个槽函数去实现功能,如果直接关联到一个函数中,该函数只能执行一份功能,有时候并不能满足业务需求在多个信号绑定到同一个槽函数的... -
Python 函数
2021-03-05 11:18:51Python函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被... -
Python函数总结大全(函数定义,参数种类、返回值等)
2021-05-17 21:14:29目录 函数与函数式编程 ...函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。我们也可.. -
Loadrunner关联原理/方法/关联函数/技术介绍
2015-01-23 17:33:07在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得... -
虚函数的三种调用方式——对象名、指针和引用
2019-05-04 16:42:53所以属于静态关联,如果通过基类指针调用虚函数,在编译阶段无法从语句本身确定调用哪一个类的虚函数,只有在运行时,指针指向某一具体对象后,才能确定调用的是哪一个类的虚函数,故为动态关联; tips: ... -
python 函数
2021-02-10 22:19:15定义函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段函数能提高应用的模块性,和代码的重复利用率函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可面向对象:对函数... -
index函数
2021-05-21 12:17:27手机评站网今天精心准备的是《index函数》,下面是...函数INDEX()有两种形式:数组形式和引用形式。数组形式通常返回数值或数值数组;引用形式通常返回引用。比如:=INDEX(A1:D1,0,2) 这里的数据区域是一行,所以行... -
python 自定义函数
2020-12-08 16:26:17函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户... -
透彻理解高斯核函数背后的哲学思想与数学思想
2019-02-03 10:27:51在此,作一个类比如下:一个人看过湖泊,河流,溪流,浅滩等,但从未见过大海。你怎么向这个人解释大海是什么?也许可以通过将海水中的水量与人们已经知道的水体中的水量相关联来解释。 简... -
深入理解数据库当中的聚合函数
2017-03-15 08:27:254、具体实例应用1、聚合函数的相应概念在数据库当中,函数分为两种:单行函数和多行函数,相应概念如下: 单行函数:每一行返回一个数值(如lower) 多行函数:多行返回一个数值(如count) 聚合函数:多行函数,... -
Python 函数注释
2017-07-03 19:30:18在 Python 3.x 中,增加了一个新特性 - 函数注释(Function Annotations),顾名思义,可做为函数额外的注释来用。 函数注释是一个可选功能,它允许在函数参数和返回值中添加任意的元数据。无论是 Python 本身还是... -
『Excel』常用五大类函数汇总
2020-03-28 10:27:18这里对数据分析中常用的excel函数进行分类汇总,共五类:关联匹配类、清洗处理类、逻辑运算类、计算统计类、时间序列类 一、关联匹配类 数据不在同一个excel表或同一个excel表不同sheet中,数据太多,copy麻烦也不... -
tensorflow中常用的激活函数
2018-08-19 22:19:46激活函数(activation function)运行时激活神经网络中某一部分神经元,将激活神经元的信息输入到下一层神经网络中。神经网络之所以能处理非线性问题,这归功于激活函数的非线性表达能力。激活函数需要满足数据的输入... -
JS函数详解
2019-07-10 22:56:562.函数表达式(匿名函数) 3.函数传参 4.修改input的值 5.函数的不定参(可变参)—关键字arguments 6.函数返回值 7.封装获取元素的方法 8.获取计算后样式—getComputedStyle(el) 8.JS预解析机制(变量提升... -
python基础-函数
2021-01-14 14:40:44函数的基本使用函数的参数详解名称空间与作用域闭包函数装饰器2020.9.11小白学习,如有错误欢迎指点参考自egon大佬Python快速入门神器www.zhihu.com函数使用函数的原因:所有功能的实现代码堆叠在一起,导致代码的... -
Lua注册C++类及函数
2012-11-26 10:02:46本文版权归 csdn whitehack 所有,转载请自觉标明原创作者及出处,以示尊重!! 作者:whitehack ... [-] ...Registering Callbacks(注册lua c函数)Registering Object Dispatch Functors(注册一个 -
matlab拟合函数的三种方法
2020-02-14 12:07:39方法一:多项式拟合polyfit x=[1 2 3 4 5 6 7 8 9]; y=[9 7 6 3 -1 2 5 7 20]; P= polyfit(x, y, 3) %三阶多项式拟合 xi=0:.2:10; yi= polyval(P, xi); %求对应y值 plot(xi,yi,x,y,'r*'); 运行结果: 多项式... -
【图文详细 】Hive 函数、Hive 函数、Hive 函数
2018-12-02 14:34:151.hive内置函数 1.1、内容较多,见《Hive 官方文档》 ... 1.2、测试内置函数的快捷方式: 第一种方式:直接使用,例如:select concat('a','a') -
C++函数编译原理和成员函数的实现
2017-07-25 15:34:54对象的内存中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 stu 的类型为 Student,也不知道它还有四个成员函数 setname()、setage()、setscore()、show(),C++ 究竟是如何通过对象调用成员函数... -
C++指向类成员(数据、函数)的指针
2017-08-20 18:37:20指向【类】的成员的指针包含两种: ★指向【类】的数据成员的指针 ★指向【类】的成员函数的指针 注意:指向的是【类的成员】,和类发生关系 ★★★指向非静态公有数据成员的指针,在定义时必须和类相关联,在... -
【Excel函数】CORREL函数 - 曹海峰个人博客
2020-12-28 21:19:01本文介绍Microsoft Excel中CORREL函数的语法和用法。CORREL函数适用于:Excel2003、Excel2007、...使用相关系数可以确定两种属性之间的关系。例如,可以检测某地的平均温度和空调使用情况之间的关系;检测学生的物...