当前位置: 首页 > news >正文

网站建设能挣钱百度广告投放价格表

网站建设能挣钱,百度广告投放价格表,网页制作员薪资,佛山自助建站软件目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看,不能交互,信号槽可以让界面进行人机…

目录

信号槽

1. 概念

2. 函数原型

3. 连接方式

3.1 自带信号 → 自带槽

3.2 自带信号 → 自定义槽

3.3 自定义信号

4. 信号槽传参

5. 对应关系

5.1 一对多

5.2 多对一


信号槽

1. 概念

    之前的程序界面只能看,不能交互,信号槽可以让界面进行人机交互。

    信号槽是Qt在C++基础上新增的特性,类似于其他编程中的回调机制,其目的是实现对象之间的通信。

使用信号槽需要具备两个先决条件:

  • 通信的对象必须继承自QObject

QObject是Qt所有对象的基类,内部规定了Qt最基础的对象特性。

  • 类中要包含Q_OBJECT宏

2. 函数原型

信号槽的建立是通过connect函数实现的。

// 信号槽连接函数
// 参数1:发射者,因发起的对象n.
// 参数2:信号函数,因的动作v.,需要使用SIGNAL()包裹函数名称
// 参数3:接收者,果执行的对象n.
// 参数4:槽函数,果的动作v.,需要使用SLOT()包裹函数名称
QObject::​connect(const QObject * sender, const char * signal, const QObject * receiver, const char * slot)                [static]

    信号函数一定来自于发射者,槽函数一定来自于接收者。信号槽的连接必须在发射者对象和接收者对象创建完成后进行,如果成功连接后,发射者或接收者对象销毁了,连接断开。

    信号槽的连接也可以程序员手动断开,只需要把connect函数改为disconnect即可,参数保持不变。

3. 连接方式

为了讲课,按照难易程度分为三种连接方式:

  • 自带信号 → 自带槽
  • 自带信号 → 自定义槽
  • 自定义信号 → 槽

3.1 自带信号 → 自带槽

    这种连接方式是最简单的连接方式,因为信号函数和槽函数都是Qt内置的,程序员只需要找到连接的四个参数,直接连接即可。

【例子】点击按钮,关闭窗口。

分析:

参数1:发射者——按钮对象

参数2:信号函数——点击

void QAbstractButton::​clicked()                    [signals]

参数3:接收者——窗口对象

参数4:槽函数——关闭

bool QWidget::​close()                            [slot]

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton *btn;
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn = new QPushButton("关闭",this);btn->move(100,100);//  参数1:发射者——按钮对象//	参数2:信号函数——点击//	参数3:接收者——窗口对象//	参数4:槽函数——关闭connect(btn,SIGNAL(clicked()),this,SLOT(close()));
}Dialog::~Dialog()
{delete btn;
}

3.2 自带信号 → 自定义槽

    这种连接方式是使用的最多的一种连接方式,因为在实际开发中,Qt无法预设所有的槽函数情况,对于复杂的操作执行逻辑,需要程序员手动编写槽函数。

槽函数是一种特殊的成员函数。

【例子】点击按钮,窗口向右下角移动10个像素,并且后台输出当前窗口的位置。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton *btn;// 槽函数的声明
private slots: // 最小权限原则void mySlot(); // 自定义槽函数
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn = new QPushButton("关闭",this);btn->move(100,100);// 连接信号槽connect(btn,SIGNAL(clicked()),this,SLOT(mySlot()));
}void Dialog::mySlot()
{// 先获得当前坐标int x = this->x();int y = this->y();// 移动move(x+10,y+10);// 输出当前窗口位置qDebug() << this->x() << this->y();
}Dialog::~Dialog()
{delete btn;
}

3.3 自定义信号

    自定义信号通常用于解决一些对象之间“远距离”通信问题,本节属于强行使用,因此并不是问题最优解,只是为了展示自定义信号的使用方式。

【例子】点击按钮,按钮上显示点击的次数。

先忽略自定义信号,展示正常解法:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton* btn;int count;private slots:void btnClickedSlot(); // 点击按钮的槽函数
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent),count(0) // 构造初始化列表
{resize(400,400);btn = new QPushButton("0",this);btn->move(200,200);connect(btn,SIGNAL(clicked()),this,SLOT(btnClickedSlot()));
}void Dialog::btnClickedSlot()
{count++;// int → QStringQString text = QString::number(count);// 设置到按钮上显示btn->setText(text);
}Dialog::~Dialog()
{delete btn;
}

基于上面的解法,强行增加自定义信号发射环节:

     信号函数是一种特殊的函数,只有声明没有定义,声明后可以直接配合emit关键字发射。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton* btn;int count;signals:void countSignal(); // 自定义信号private slots:void btnClickedSlot(); // 点击按钮的槽函数void countSlot(); // 与自定义信号连接的槽函数
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent),count(0) // 构造初始化列表
{resize(400,400);btn = new QPushButton("0",this);btn->move(200,200);connect(btn,SIGNAL(clicked()),this,SLOT(btnClickedSlot()));connect(this,SIGNAL(countSignal()),this,SLOT(countSlot()));
}void Dialog::btnClickedSlot()
{count++;// 发射自定义信号emit countSignal();
}/*** @brief Dialog::countSlot* 中转之后更新按钮显示的槽函数*/
void Dialog::countSlot()
{QString text = QString::number(count);btn->setText(text);
}Dialog::~Dialog()
{delete btn;
}

4. 信号槽传参

    信号槽可以进行参数传递,信号函数携带参数发射,槽函数可以收到此参数。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton* btn;int count;signals:void countSignal(int); // 自定义信号private slots:void btnClickedSlot(); // 点击按钮的槽函数void countSlot(int); // 与自定义信号连接的槽函数
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent),count(0) // 构造初始化列表
{resize(400,400);btn = new QPushButton("0",this);btn->move(200,200);connect(btn,SIGNAL(clicked()),this,SLOT(btnClickedSlot()));connect(this,SIGNAL(countSignal(int)),this,SLOT(countSlot(int)));
}void Dialog::btnClickedSlot()
{count++;// 发射自定义信号(携带参数)emit countSignal(count);
}/*** @brief Dialog::countSlot* count参数是信号函数发来的,不是成员变量* 中转之后更新按钮显示的槽函数*/
void Dialog::countSlot(int count)
{QString text = QString::number(count);btn->setText(text);
}Dialog::~Dialog()
{delete btn;
}

需要注意的是:

  • 理论上可以传递任意多个参数
  • 信号函数的参数个数必须大于等于槽函数的参数个数
  • 参数类型需要匹配

5. 对应关系

    同一个信号可以连接到多个槽(一对多),多个信号也可以连接到同一个槽(多对一)。

5.1 一对多

    槽函数也是成员函数,因此在一对多的连接关系中,把连接的多个槽函数可以看做是普通的成员函数,合并为一个槽函数。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton* btn1;QPushButton* btn2;private slots:void btnClickedSlot1();void btnClickedSlot2();void btnClickedSlot3(); // 3 = 1 + 2
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn1 = new QPushButton("一对多", this);btn1->move(200,100);btn2 = new QPushButton("一对一", this);btn2->move(100,200);// 一对多connect(btn1,SIGNAL(clicked()),this,SLOT(btnClickedSlot1()));connect(btn1,SIGNAL(clicked()),this,SLOT(btnClickedSlot2()));// 一对一connect(btn2,SIGNAL(clicked()),this,SLOT(btnClickedSlot3()));
}void Dialog::btnClickedSlot1()
{qDebug() << "A";
}void Dialog::btnClickedSlot2()
{qDebug() << "B";
}void Dialog::btnClickedSlot3()
{// 直接把Slot1和Slot2两个函数当做普通的成员函数,// 使用this指针调用btnClickedSlot1();btnClickedSlot2();
}Dialog::~Dialog()
{delete btn1;
}

5.2 多对一

    多对一的连接方式下,槽函数无法区分信号来源,可以在槽函数中调用sender函数获取发射者对象,从而判断信号来源。

// 在槽函数中调用,返回发射者对象
QObject * QObject::​sender() const

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QPushButton* btn1;QPushButton* btn2;private slots:void btnsClickedSlot();
};#endif // DIALOG_H

dialog.cpp
#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);btn1 = new QPushButton("A",this);btn2 = new QPushButton("B",this);btn1->move(150,100);btn2->move(150,200);// 多对一connect(btn1,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));connect(btn2,SIGNAL(clicked()),this,SLOT(btnsClickedSlot()));
}void Dialog::btnsClickedSlot()
{if(btn1 == sender()){qDebug() << "点击了按钮1";}else if(btn2 == sender()){qDebug() << "点击了按钮2";}qDebug() << "槽函数触发!";
}Dialog::~Dialog()
{delete btn1;delete btn2;
}


文章转载自:
http://diomed.pqbz.cn
http://cutlet.pqbz.cn
http://contributor.pqbz.cn
http://heartbroken.pqbz.cn
http://ponderous.pqbz.cn
http://fermata.pqbz.cn
http://adulterer.pqbz.cn
http://kidnap.pqbz.cn
http://sulfuret.pqbz.cn
http://ringy.pqbz.cn
http://cheeselike.pqbz.cn
http://tarboard.pqbz.cn
http://holocaine.pqbz.cn
http://polymeter.pqbz.cn
http://fenny.pqbz.cn
http://megabuck.pqbz.cn
http://crushhat.pqbz.cn
http://prefactor.pqbz.cn
http://gastroduodenostomy.pqbz.cn
http://iracund.pqbz.cn
http://dowtherm.pqbz.cn
http://fibulae.pqbz.cn
http://rotatory.pqbz.cn
http://chorda.pqbz.cn
http://hereinbefore.pqbz.cn
http://greeneland.pqbz.cn
http://teleplay.pqbz.cn
http://mitre.pqbz.cn
http://acumination.pqbz.cn
http://reinterpret.pqbz.cn
http://flection.pqbz.cn
http://crocky.pqbz.cn
http://stygian.pqbz.cn
http://tintype.pqbz.cn
http://topochemistry.pqbz.cn
http://viewsite.pqbz.cn
http://incinerate.pqbz.cn
http://microbial.pqbz.cn
http://hybridist.pqbz.cn
http://epidermization.pqbz.cn
http://nanoatom.pqbz.cn
http://semitragic.pqbz.cn
http://terra.pqbz.cn
http://unallied.pqbz.cn
http://fireless.pqbz.cn
http://oam.pqbz.cn
http://divest.pqbz.cn
http://scapegoat.pqbz.cn
http://conclude.pqbz.cn
http://bolero.pqbz.cn
http://jobbernowl.pqbz.cn
http://disentangle.pqbz.cn
http://midst.pqbz.cn
http://unmatchable.pqbz.cn
http://outmarch.pqbz.cn
http://banjarmasin.pqbz.cn
http://svd.pqbz.cn
http://surcharge.pqbz.cn
http://hindi.pqbz.cn
http://maraca.pqbz.cn
http://nemacide.pqbz.cn
http://semiautomated.pqbz.cn
http://diverse.pqbz.cn
http://nourishment.pqbz.cn
http://swellmobsman.pqbz.cn
http://myoblast.pqbz.cn
http://slumberous.pqbz.cn
http://modi.pqbz.cn
http://embacle.pqbz.cn
http://dioptometer.pqbz.cn
http://deedbox.pqbz.cn
http://helispherical.pqbz.cn
http://buckayro.pqbz.cn
http://fluvio.pqbz.cn
http://chinfest.pqbz.cn
http://perfin.pqbz.cn
http://gisborne.pqbz.cn
http://peripeteia.pqbz.cn
http://diplegic.pqbz.cn
http://embarrassment.pqbz.cn
http://trichuriasis.pqbz.cn
http://glossolaryngeal.pqbz.cn
http://daredevil.pqbz.cn
http://earthstar.pqbz.cn
http://carbecue.pqbz.cn
http://logotherapy.pqbz.cn
http://chorister.pqbz.cn
http://intonation.pqbz.cn
http://jazzetry.pqbz.cn
http://nemo.pqbz.cn
http://hymnist.pqbz.cn
http://earthrise.pqbz.cn
http://srv.pqbz.cn
http://chautauqua.pqbz.cn
http://harewood.pqbz.cn
http://euphorigenic.pqbz.cn
http://wauk.pqbz.cn
http://interfaith.pqbz.cn
http://featherbed.pqbz.cn
http://expiscate.pqbz.cn
http://www.dt0577.cn/news/124414.html

相关文章:

  • 做海报可以在哪些网站下载素材网络优化工作应该怎么做
  • 可以在线做试卷的网站天天seo伪原创工具
  • 哪种语言做网站国内最好的搜索引擎
  • 做的网站有广告营销推广的作用
  • 微官网与手机网站首页牛推网
  • 网站访客代码js杭州seo招聘
  • 云南电商网站建设西安网站推广排名
  • 网站上的动效是用ae做的seo教程论坛
  • 招远网站建设价格短网址生成器免费
  • 做网站前期框架图my63777免费域名查询
  • 专业做网站推广的公司免费开发网站
  • office里做网站的工具搜索大全搜索引擎
  • 怎么用we做网站搭建一个网站的流程
  • 住房和城建设网站简述网络营销的方法
  • 腾讯企点qtrade保定seo博客
  • 鹰潭市建设局网站徐州seo招聘
  • 表格可以做网站么新手怎么做网络销售
  • 网站建设的价值百度云盘搜索引擎入口
  • gif在线制作生成器seo推广的方法
  • 美食分享网站设计宁波seo网络推广定制多少钱
  • 信阳企业网站建设公司长沙谷歌优化
  • 如何看网站是用什么框架做的郑州seo方案
  • 公司网站建设费属于什么费用佛山网站优化排名推广
  • wordpress4.6手册 chm北京网站优化推广公司
  • 深圳市龙华区政府官网seo关键词排名优化哪好
  • 怎样理解网站建设与开发这门课品牌运营策划
  • 建立网站卖没有版权的电子书广州seo优化外包公司
  • wordpress菜单 链接济源新站seo关键词排名推广
  • 东道设计公司在线seo关键词排名优化
  • 为客户做网站的方案自己建网站的详细步骤