Qt学习总结(C鱼)之信号与槽01

自动关联

第一种自然是手动关联了,只要调用connect函数就能实现自动关联。
这里重点讲第二种,自动关联:
为了实现槽函数自动进行关联,对于Qt窗口部件已经提供的信号,可按照以下规范命名:
void on_<窗口部件名称>_<信号名称>_(<信号参数>);

自动关联只适用于Qt部件已经定义好的信号,如果是程序员自己定义的信号则必须手动关联。还有,对于是在Qt设计器往界面添加的部件,那么就可以直接写上面函数格式,以实现自动关联。但是对于不是在Qt设计器往界面添加的部件,我们就要在调用setUi()函数前定义该部件,而且还要使用setObjectName()函数指定部件的对象名,重点来了,setObjectName()函数设置的对象名必须与窗口部件名称一样,即,全部名字一样,那才能够实现自动关联。

例如:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    //自动关联
    button=new QPushButton(this);
    button->move(50,100);
    button->setText(tr("二重点击"));
    button->setObjectName(tr("button"));//对象名尤其重要,一定要相同
    ui->setupUi(this);
    //手动关联connect(ui->showChildButton,SIGNAL(clicked()),this,SLOT(showChildDialog()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_button_clicked()
{
    QDialog *dialog=new QDialog(this);
    dialog->show();
}

断开信号和槽(disconnect)

当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。
bool QObject::disconnect (const QObject sender, const char signal, const Object receiver, const char slot) [static]
有三种情况必须使用 disconnect() 函数:
(1)断开与某个对象相关联的任何对象。

disconnect(sender, 0, 0, 0) ;
//或者
sender->disconnect();

(2)断开与某个特定信号的任何关联。
disconnect(sender, SIGNAL(signal()), 0, 0);```
//或者
sender->disconnect(SIGNAL(signal()));
(3)断开两个对象之间的关联。
disconnect(sender, 0, receiver, 0);
//或者
sender->disconnect(receiver);

信号映射器QSignalMapper类

SignalMapper类可以简单的理解为信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject参数或者QWidget参数的信号,并将之转发。经常用在同种却多个信号连接同一个槽的情况下。

//1.第一步:创建信号映射器对象
QSignalMapper *signal_mapper = new QSignalMapper(this);

//2.让同种却多个信号的部件连接信号映射器map槽,map槽会发射mapped信号,mapped信号的参数由setMapping函数的第二个参数决定。
connect(push_button_1, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
connect(push_button_2, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
connect(tool_button_1, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
connect(tool_button_2, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);

//3.设置翻译的内容,也就是第二个参数
signal_mapper->setMapping(push_button_1, QString::number(BUTTON_1, 10));
signal_mapper->setMapping(push_button_2, QString::number(BUTTON_2, 10));
signal_mapper->setMapping(tool_button_1, QString::number(BUTTON_3, 10));
signal_mapper->setMapping(tool_button_2, QString::number(BUTTON_4, 10));

//4.映射器重新发射信号,执行槽函数
connect(signal_mapper, &QSignalMapper::mapped, this, &MyWidget::changeButton);

void MyWidget::changeButton(QString text)
{
    int index = text.toInt();
    QString information = QString("");
    switch(index)
    {
    case BUTTON_1:
        information = QString("clicked 1");
        break;

    case BUTTON_2:
        information = QString("clicked 2");
        break;

    case BUTTON_3:
        information = QString("clicked 3");
        break;

    case BUTTON_4:
        information = QString("clicked 4");
        break;

    default:
        information = QString("which is clicked?");
        break;
    }
    QMessageBox::information(NULL, QString("Title"), information);
}

原文地址:http://blog.51cto.com/12731497/2108631

时间: 2024-10-19 00:01:05

Qt学习总结(C鱼)之信号与槽01的相关文章

【Qt】2.2 继续了解信号和槽

槽和普通成员函数一样,可以是虚函数.被重载,可以是公有.私有.保护的.它可以被其它C++成员函数调用. 槽连接了信号,当发射这个信号时,槽会被自动调用. 连接函数: bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) sende

Qt学习(17)

Qt学习(17)——自定义信号和槽 本节首先介绍一下C++编程中常用的传递数据机制,包括类对象的公有成员变量.友元类/函数.公有函数.回调函数等等,这些机制在Qt程序中也是可以使用的.然后重点介绍如何在Qt类里面自定义信号和槽,通过手动触发信号来调用槽函数,完成两个对象之间的消息传递,本节最后示范一个信号接力触发的例子.本节内容较多,分三部分来学习. 1.C++的沟通方式 C++编程中常遇到各个对象之间进行沟通的情景,需要将数据从一个对象传递给另一个对象来处理.大致的方法有如下几种: 接收端定义

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Qt on Android: Qt Quick 事件处理之信号与槽

前面两篇文章< Qt on Android:QML 语言基础>和<Qt on Android: Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简单的 Qt Quick 应用了.接下来呢,哈,我们要介绍 Qt Quick 中一个灰常灰常重要的主题:事件处理.这将是比较长长长长的一篇,哦,不还有后续好几篇--废话少说,还是谈正事儿吧兄弟姐妹们. 本文参加 CSDN 博文大赛,请点这里投我一票,谢

【Qt学习笔记】3.事件处理

首先解释几个名词 事件: Qt中的事件,主要指用户输入事件,比如:点击一个按钮.选中复选框.按下回车等. 事件处理: 当事件发生时,程序做出的反应,比如:当点击显示按钮时,程序弹出一个对话框,或产生其他相应. 信号和槽: Qt中的事件处理机制叫做信号和槽 (signal & slot) 其理论模型为: 对象 a 中有一个信号signal:XXX(代表一个事件) 对象 b 中有一个槽slot:YYY(事件处理函数) 事先把它们连接起来, connect(a, XXX, b, YYY); 然后,当

第81课 信号与槽的连接方式

1. QObject::connect函数 bool connect(const QObject* sender, //发送者 const char* signal, //信号 const QObject* receiver, //接收者 const char* method, //槽函数 Qt::ConnectionType type = Qt::AutoConnection);//连接方式 2. 深入信号与槽的连接方式 (1)Qt::DirectConnection(直接连接,立即调用):直

信号和槽

1) 信号的定义必须在signals:保留字下,并且不需要实现 2)槽的定义必须在slots:保留字下,需要实现 3)信号和槽通过QObject::connect函数连接 4)当信号被触发时,槽函数被调用 需要注意的是: 1)信号和槽,是QT的拓展,所以实现信号和槽的类,必须是QObject的子类 2)实现信号和槽的类,必须以宏Q_OBJECT开始 3)连接信号和槽,要用到SIGNAL和SLOT宏,转换函数为字符串 4)一个信号可以和多个槽连接,槽函数调用的顺序是不确定的 5)多个信号可以同时连

PyQt 5信号与槽的几种高级玩法

PyQt 5信号与槽的几种高级玩法 http://www.broadview.com.cn/article/824 在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制.当信号发射时,连接的槽函数将会自动执行.在PyQt 5中信号与槽通过object.signal.connect()方法连接. PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号.信号与槽具有如下特点. 一个信号可以连接多个槽. 一个信号可以

QT学习小结之信号与槽

信号与槽函数是我们学习QT必备的基础知识,今天跟大家分享我学习QT的一些总结吧. 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯. 槽函数和普通的C++成员函数没有很大的区别.它们也可以使virtual的:可以被重写:可以使public.protected或者private的:可以由其它的C++函数调用:参数可以是任何类型的.如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用. 信号与槽函数的连接我们可以用connect