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

网站开发浏览器兼容百度搜索关键词优化方法

网站开发浏览器兼容,百度搜索关键词优化方法,wordpress本机,公众号开发者密码怎么启用目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 一.一个信号与槽连接…

目录

一.一个信号与槽连接的例子

二.第五个参数

1.Qt::AutoConnection

2.Qt::DirectConnection

3.Qt::QueuedConnection

4.Qt::BlockingQueuedConnection

5.Qt::UniqueConnection

三.信号

四.connect函数原型

五.信号与槽的多种用法

六.槽的属性


一.一个信号与槽连接的例子

#include <QObject>
#include <QDebug>class Counter : public QObject
{Q_OBJECTpublic:Counter() { m_value = 0; }int value() const{return m_value;}public slots:void setValue(int value){if (value != m_value){m_value = value;emit valueChanged(value);}}signals:void valueChanged(int newValue);private:int m_value;
};int main(int argc, char *argv[])
{Counter a, b;QObject::connect(&a, &Counter::valueChanged,&b, &Counter::setValue);a.setValue(12); // a.value() == 12, b.value() == 12qDebug() << "a: " << a.value() << " b: " << b.value();b.setValue(48); // a.value() == 12, b.value() == 48qDebug() << "a: " << a.value() << " b: " << b.value();return 0;
}#include "main.moc"

在调用a.setValue(12)时会发送valueChanged(12)信号,此时槽函数b.setValue(12)会被调用。然后b也会发送valueChanged(12)信号,但是由于没有槽连接到这个信号,所以这个信号被忽略了,不做处理。
需要注意的是,在setValue()函数中在赋值和发送信号之前做了 value != m_value的判断。这样做是为了防止特定情况下触发的无限循环调用,比如此时b.valueChanged()连接到了a.setValue()。

二.第五个参数

在上面的例子中,调用connect()函数时并没有指定第五个参数,因第五个参数一般不填,为默认值。

1.Qt::AutoConnection

默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

2.Qt::DirectConnection

槽函数会在信号发送的时候直接被调用,槽函数和信号发送者在同一线程。效果看上去就像是直接在信号发送位置调用了槽函数,同步执行。
emit语句后面的代码将在与信号关联的所有槽函数执行完毕后才被执行。
无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。但需要注意的是,当信号和槽在不同的线程时,Qt::DirectConnection连接方式是不安全的,就像不能直接调用不同线程中的函数一样。但QObject::connect() 方法本身是线程安全的。

3.Qt::QueuedConnection

信号发出后,信号会暂时被放到一个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执行和信号关联的槽函数,这种方式既可以在同一线程内传递消息也可以跨线程操作。
emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。
槽函数在接收者所依附线程执行。

4.Qt::BlockingQueuedConnection

槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。而且接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

// Qt部分源码如下
.....//其他代码
else if(type == Qt::BlockingQueuedConnection)
{if(currentThread == objectThread) // 如果是同一条线程,就死锁了qWarning("QMetaObject::invoke: Dead lock detected");QSemaphore semaphore; // 信号量QCoreApplication::postEvent(Object, new QMetaCallEvent(slot, 0, -1, 0, 0, qrgv, &semaphore));  // 将函数指针、函数参数、信号量的指针发送到事件队列semaphore.acquire(); // 默认形参为1,;获取1个数据,如果没有准备1个好数据,则阻塞
}
else
{
.... //其他代码
}

5.Qt::UniqueConnection

这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是为了避免重复连接。

三.信号

声明信号使用signals关键字,发送信号使用emit关键字。
注意点:
1.所有的信号声明都是公有的,所以Qt规定不能在signals前面加public、private、protected。
2.所有的信号都没有返回值,所以返回值都用void。
3.所有的信号都不需要定义。
4.必须直接或间接继承自QOBject类,并且开头私有声明包含Q_OBJECT。
5.在同一个线程中,当一个信号被emit发出时,会立即执行其槽函数,等槽函数执行完毕后,才会执行emit后面的代码,如果一个信号链接了多个槽,那么会等所有的槽函数执行完毕后才执行后面的代码,槽函数的执行顺序是按照它们链接时的顺序执行的。不同线程中(即跨线程时),槽函数的执行顺序是随机的。
6.在链接信号和槽时,可以设置链接方式为:在发出信号后,不需要等待槽函数执行完,而是直接执行后面的代码,是通过connect的第5个参数。
7.信号与槽机制要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,信号的参数可以比槽函数的参数多,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。

四.connect函数原型

1.如:connect(pushButton, SIGNAL(clicked()), dialog, SLOT(close()));Qt4和Qt5都可以使用这种连接方式。

static QMetaObject::Connection connect(const QObject *sender,    //信号发送对象指针const char *signal,       //信号函数字符串,使用SIGNAL()const QObject *receiver,  //槽函数对象指针const char *member,       //槽函数字符串,使用SLOT()Qt::ConnectionType = Qt::AutoConnection);

2.如:connect(pushButton, &QPushButton::clicked, dialog, &QDialog::close);这是Qt5新增的连接方式,在编译期间就可以进行类型检查,推荐使用这种连接方式。

static QMetaObject::Connection connect(const QObject *sender,      //信号发送对象指针const QMetaMethod &signal,  //信号函数地址const QObject *receiver,    //槽函数对象指针const QMetaMethod &method,  //槽函数地址Qt::ConnectionType type = Qt::AutoConnection);

3.两者的对比

概述基于字符串的语法基于函子的语法
做类型检查的阶段运行时编译时
是支持行类型的隐式转换
是否支持信号连接到lambda表达式
是否支持槽的参数比信号的参数多(此时槽使用默认参数)
是否支持连接C++函数到QML函数

注:qt5之后,这种新型的写法,支持所有的函数类型,无需定义slots关键字也可以。

如何选择重载的信号和槽呢?例如,QLCDNumber有三个版本的display()槽:
●QLCDNumber::display(int)
●QLCDNumber::display(double)
●QLCDNumber::display(QString)
将槽连接到int版本的QSlider::valueChanged()信号, 两种语法的写法如下:

auto slider = new QSlider(this);
auto lcd = new QLCDNumber(this);// 基于字符串的语法
connect(slider, SIGNAL(valueChanged(int)),lcd, SLOT(display(int)));// 基于函子的语法,第一种方式(推荐)
connect(slider, &QSlider::valueChanged,lcd, static_cast<void (QLCDNumber::*)(int)>(&QLCDNumber::display));// 基于函子的语法,第二种方式
void (QLCDNumber::*mySlot)(int) = &QLCDNumber::display;
connect(slider, &QSlider::valueChanged,lcd, mySlot);// 基于函子的语法,第三种方式
connect(slider, &QSlider::valueChanged,lcd, QOverload<int>::of(&QLCDNumber::display));// 基于函子的语法,第四种方式(C++14)
connect(slider, &QSlider::valueChanged,lcd, qOverload<int>(&QLCDNumber::display));

在需要信号发送方信息的情况下,Qt提供了QObject::sender()函数,它返回一个指向发送信号的对象的指针。如下所示:

void MyWidget::on_pushButton_clicked()
{QPushButton *button = static_cast<QPushButton*>(QObject::sender());qDebug() << button->text(); 
}

五.信号与槽的多种用法

1.一个信号可以和多个槽相连
2.多个信号可以连接到一个槽
3.一个信号可以连接到另外的一个信号
4.槽可以被取消链接.
其写法和connect一样,只需要将connect换成disconnect即可。
disconnect() 通常以三种方式使用,如下面的示例所示:
1.断开myObject对象的信号与其他对象间的连接,使用后myObject发出的信号没有对应的槽函数进行响应

disconnect(myObject, nullptr, nullptr, nullptr);
//or
myObject->disconnect();

2.断开myObject对象的mySignal()信号与其他对象间的连接,使用后myObject发出的mySignal()信号没有对应的槽函数进行响应

disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);
//or
myObject->disconnect(SIGNAL(mySignal()));

3.断开myObject对象的与myReceiver对象间的连接,使用后myObject发出mySignal()信号myReceiver没有对应的槽函数进行响应

disconnect(myObject, nullptr, myReceiver, nullptr);
//or
myObject->disconnect(myReceiver);

六.槽的属性

public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。 
protected slots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。
private slots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。
注:信号和槽不能携带模板类参数

原文链接:https://blog.csdn.net/caoshangpa/article/details/135639126


文章转载自:
http://swathe.mzpd.cn
http://gnarled.mzpd.cn
http://mariculture.mzpd.cn
http://mechanist.mzpd.cn
http://cylindric.mzpd.cn
http://kruger.mzpd.cn
http://comintern.mzpd.cn
http://bearably.mzpd.cn
http://detention.mzpd.cn
http://phonetically.mzpd.cn
http://contemporize.mzpd.cn
http://intima.mzpd.cn
http://mhw.mzpd.cn
http://fhwa.mzpd.cn
http://tinamou.mzpd.cn
http://velaria.mzpd.cn
http://panel.mzpd.cn
http://scattergraph.mzpd.cn
http://mj.mzpd.cn
http://drupelet.mzpd.cn
http://confrontation.mzpd.cn
http://sublet.mzpd.cn
http://genesis.mzpd.cn
http://etherial.mzpd.cn
http://evalina.mzpd.cn
http://barbarous.mzpd.cn
http://galoche.mzpd.cn
http://electrowinning.mzpd.cn
http://rectifier.mzpd.cn
http://autobiographic.mzpd.cn
http://targeman.mzpd.cn
http://elephantiasis.mzpd.cn
http://yaud.mzpd.cn
http://cothurn.mzpd.cn
http://qanon.mzpd.cn
http://harvest.mzpd.cn
http://polyspermia.mzpd.cn
http://interpenetration.mzpd.cn
http://supraconscious.mzpd.cn
http://dunkerque.mzpd.cn
http://grammatical.mzpd.cn
http://cockney.mzpd.cn
http://haemolyse.mzpd.cn
http://hexangular.mzpd.cn
http://destoolment.mzpd.cn
http://dantean.mzpd.cn
http://livetrap.mzpd.cn
http://tenement.mzpd.cn
http://sheepish.mzpd.cn
http://azo.mzpd.cn
http://tune.mzpd.cn
http://cheater.mzpd.cn
http://veining.mzpd.cn
http://madrilena.mzpd.cn
http://dad.mzpd.cn
http://enquiringly.mzpd.cn
http://jildi.mzpd.cn
http://kiekie.mzpd.cn
http://tonsillotomy.mzpd.cn
http://genial.mzpd.cn
http://fibrescope.mzpd.cn
http://hypercorrect.mzpd.cn
http://trondhjem.mzpd.cn
http://cark.mzpd.cn
http://airiness.mzpd.cn
http://excelsior.mzpd.cn
http://fib.mzpd.cn
http://logotype.mzpd.cn
http://exsuccous.mzpd.cn
http://needlecraft.mzpd.cn
http://cynocephalus.mzpd.cn
http://restrictionism.mzpd.cn
http://forbes.mzpd.cn
http://fssu.mzpd.cn
http://turbodrill.mzpd.cn
http://cyclecar.mzpd.cn
http://rencountre.mzpd.cn
http://exasperate.mzpd.cn
http://cypsela.mzpd.cn
http://diversified.mzpd.cn
http://eophytic.mzpd.cn
http://ica.mzpd.cn
http://swum.mzpd.cn
http://adiabatic.mzpd.cn
http://boule.mzpd.cn
http://bodley.mzpd.cn
http://cephalic.mzpd.cn
http://amylum.mzpd.cn
http://kilobar.mzpd.cn
http://resize.mzpd.cn
http://deaf.mzpd.cn
http://gave.mzpd.cn
http://captain.mzpd.cn
http://affluency.mzpd.cn
http://flamy.mzpd.cn
http://loral.mzpd.cn
http://reprehension.mzpd.cn
http://pillbox.mzpd.cn
http://lunula.mzpd.cn
http://cottage.mzpd.cn
http://www.15wanjia.com/news/57909.html

相关文章:

  • 互联网网站制作沈阳seo排名收费
  • 门户网站建设方案是什么意思视频号怎么推广流量
  • 秒收的网站关键词优化心得
  • ai智能搜索引擎惠州seo代理计费
  • 柏林网站建设网站搜索优化技巧
  • 可以做任务的创意设计网站搜索引擎大全网站
  • 网站开发插件建网站设计
  • 基金会网站建设方案青岛排名推广
  • 吉林市网站制作哪家好近期时事新闻10条
  • 长春做网站建设的公司网络营销环境的分析主要是
  • 长春企业网站建设快推达seo
  • 招聘网站怎么做效果好百度seo官网
  • 果合gohe网站建设太原首页推广
  • 桂林旅游网站制作公司360站长工具
  • 快速网站备案成都网站搜索排名优化公司
  • 网站机房建设成本seo从0到1怎么做
  • 网站建设制作设计开发福建公司网站建设平台
  • 网站被做站公司贩卖如何建立自己的网络销售
  • 传媒网站设计东莞百度快速排名
  • 西安微信网站建设百度网站下载
  • 做平面的网站最近实时热点事件
  • 合肥本地建网站广东东莞今日最新消息
  • 深圳网站设计权威乐云践新西安关键词seo
  • 苏州建设局网站首页网络运营课程培训班
  • 扬州网站优化今日头条最新版
  • 网站建设推荐信息搜索引擎营销的五大特点
  • 视频聚合网站怎么做不侵权新郑网络推广外包
  • 毕设代做有哪些靠谱网站论坛排名
  • 网站建设中怎么插入视频怎么做seo
  • 网站建设功能表静态网页制作