Qt学习六 - 信号与槽

一、简介

信号和槽是Qt的核心特征。用于对象间的通信,类似观察者模式。例如当一个按钮被点击,按钮监测到自己被点击了一下,就会发送一个信号(signal)。这个信号无目的,类似广播。如果我们需要处理这个信号,那么就需要使用connect来连接一个对象,使用该对象对应的槽函数(slot)来处理这个信号。也就是说,当点击按钮时,会触发与之相关联的槽函数。一个信号可以关联多个槽函数,多个信号也可以关联到一个槽函数上,甚至一个信号还可以关联到另一个信号上。当信号被发射时,这些关联的槽会一个接一个的执行,但是执行顺序是随机的,无法指定执行顺序。另外,槽函数的参数可以少于信号的参数,但是不能多于信号的参数。

二、示例

1. 在mainwindow.h中声明一个私有变量label,和一个槽

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QLabel *label;
};

2.在mainwindow.cpp中

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    label = new QLabel(this);
    label->setText(tr("this is label"));
    label->move(100,100);

    QPushButton *btn = new QPushButton(this);
    btn->setGeometry(100,150,200,40);
    btn->setText(tr("change label text"));
    connect(btn,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

}

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

void MainWindow::on_pushButton_clicked()
{
    label->setText(tr("clicked button"));
}

运行程序,当点击按钮后,label的显示内容就发生了改变。

三、自定义信号槽

其实上面的例子里,我们已经自定义了槽。自定义信号也很简单,只需要在发送信号的对象中声明一个信号,不用实现。例如在mainwindow.h中添加如下代码

signals:
    void changeLabelTxt();

这样便在mainwindow中自定义了一个信号,然后在需要发送的信号的地方调用emit发送即可。

emit changeLabelTxt();

然后在接收信号的对象中,调用connect函数连接槽。

自定义信号槽有几点需要注意:

  1. 必须继承自QObject或其子类
  2. 在类声明的最开始处添加Q_OBJECT宏
  3. 槽函数中的参数类型要与信号中的参数类型相对应,且数量不能比信号多。信号的参数个数可以比槽多,多出来的会弃用
  4. 信号只有声明,没有定义。返回值类型为void
时间: 2024-10-06 20:02:45

Qt学习六 - 信号与槽的相关文章

QT学习之信号和槽

摘要:在QT中,我们可以使用系统提供的函数实现信号和槽的链接,但是在QT中不仅仅如此,还可以让用户自己定义信号和槽函数.在本文中,我将在自己定义的teacher类下定义信号函数hungry,然后在自己定义的student类下定义槽函数treat,最后在wedget类下将两个函数进行链接.触发.显示. 1.teacher类 有信号函数,本例中就是hungry,有参数和没有参数的,其中有参数的函数中的参数代表要传递的内容 头文件: 1 #ifndef TEACHER_H 2 #define TEAC

Qt中使用信号和槽的一点心得

信号(Signal)与槽(Slot)-Qt中的典型机制 这一篇文章中都说得很详细了,这里不再重复,只说一点在实际使用中可能会遇到的问题. 1.一个信号不要同时连接几个槽函数,不然执行的顺序是随机的,最后的结果可能会和自己期待的有出入. 2.基本上,所有的信号连接槽函数之后,会执行完当前连接的槽函数,然后再执行emit信号之后的内容.但是也会有意外的情况发生:如果当前信号里面要执行的内容过于复杂(e.g.slots中又包含emit信号,本身slots函数又比较复杂等等),会导致线程之间的混乱,可能

Qt 5中信号和槽的新语法

QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上.QT 支持下列平台:MS/WINDOWS-95.98.NT 和 2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IBM AIX.SGI IRIX:EMBEDDED- 支持 framebuffer 的 Linux 平台.伴随着 KD

Qt中的信号和槽函数。

1:写一个close按钮当单击此按钮时就执行槽函数,而关闭窗口. 1 #include "slot.h" 2 #include <QApplication> 3 #include<QPushButton> 4 #include<time.h> 5 #ifndef SLOT_H 6 #define SLOT_H 7 #include <QMainWindow> 8 #include <QObject> 9 #include &l

qt 学习(六) 数据库注册用户

做什么: 1 登陆按钮按下出现注册页面, 2 输入账号  判断是否可用   查询数据库,用户名是否已经注册 3 输入密码  判断密码格式 4 输入邮箱  判断邮箱格式   查询数据库,邮箱是否已经注册 做成什么样: 怎么做: 大体是这样的: 1画ui 2 lineedit 那一栏选择信号槽,发texted信号 3 创建数据库 4 编辑槽里的判断函数 具体是这样: 1 ui设计 2 数据库放在widget.h的头文件中, 方便系统各个模块调用数据内容. 下面创建数据库 调用数据库需要的头文件 #i

Qt::ConnectionType(信号与槽的传递方式)

Qt::AutoConnection 自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接.如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接. Qt::DirectConnection 直接连接:当信号发射时,槽函数将直接被调用.无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行. Qt::QueuedConnection 队列连接:当控制权回到接受者所依附线程的事件循环时,槽函数被调用.槽函数在接收者所依附线程执行.也就是说:这种方式既可以在线程内传递

在Qt Creator 和在 vs2012 里添加信号和槽

Qt  的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了. 如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函数(在qt里称做槽slot)相连接 可以把信号理解为c#里的事件 在vs2012里和在Qt Creator里添加信号和槽不一样,这里把两种环境下怎么添加详细说明一下 1.在vs2012里添加信号和槽 新建一个qt的项目QtDemo 在qtdeom.h里添加槽 private slots: void Btn_O

关于qt学习的一点小记录

今日为了应付学校作业要求 决定现学qt来制作界面 毕竟c++不像在这方面c#可以那么方便 qt主要依靠信号.槽来实现类似winform中的消息 鉴于要尽快做完,故而没有细看qt 只是大概了解了下界面的制作方法 所以依然还有不少问题 好了我先从qt设计器开始了. 嗯,很好用的界面编辑器..一目了然啊~~~ 遇到的问题有: 1.槽明明在窗口类声明了,可设计器还是找不到... 解决:这个应该还需要在某些地方增加点代码,毕竟我find了一下别人demo的槽函数名字,发现出现在了好几个地方 嗯..这次时间

QT学习小结之信号与槽

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