Qt学习(三) QT信号:(signal)和QT槽:(slot)
2014-07-09 23:24
281 查看
1、VC中的消息机制大家都很熟悉,而Qt中的signal和slot就类似于这种消息映射与处理的过程。当要响应用户的某个操作时,VC中会触发一个消息,然后在与消息关联的处理函数中执行相应地操作。
举例来说,比如一个按钮,当用户点击时会触发点击的消息(当然其实点击按钮触发了很多消息,譬如鼠标按下、弹起、移动等等),我们就看成一个点击消息,这时就会发送一个点击消息至消息队列,从而触发与之关联的消息函数,如果消息函数的功能是显示一行文字。那么,当用户点击按钮后就显示一行文字。
Qt中亦是如此,触发消息就相当于发送一个signal(信号),而signal与特定的slot(槽)关联,而Qt槽实际上就是一个执行特定操作的函数,当收到对应signal时执行这个函数。
由上可知,signal相当于Message,而slot相当于Message的响应函数,消息映射,就是将相应的两者关联起来。
Qt中用来连接signal和slot的是QObject::connect,它有许多重载形式,具体的用到时再记录吧。
2、下面通过一个按钮例子来实现signal和slot:
就以上篇文章的工程为基础,实现目标:
.h文件:
.cpp文件:
运行结果:
点击按钮前:
点击按钮后:
结果:比较可以看到,文字改变了,但是还存在一个问题。问题是点击按钮后文字改变了,但是没有全部显示。
应该显示“Here Changed!”,但是只显示了“Here Chen”。显然,QLabel对象第二次调用setText函数是基于第一次调用的,也就是说第二次调用时文字的长度超出第一次的部分不会显示。
解决方法是,调用setGeometry函数设置显示位置和大小:
工程源码:http://download.csdn.net/detail/wwkaven/7614031
举例来说,比如一个按钮,当用户点击时会触发点击的消息(当然其实点击按钮触发了很多消息,譬如鼠标按下、弹起、移动等等),我们就看成一个点击消息,这时就会发送一个点击消息至消息队列,从而触发与之关联的消息函数,如果消息函数的功能是显示一行文字。那么,当用户点击按钮后就显示一行文字。
Qt中亦是如此,触发消息就相当于发送一个signal(信号),而signal与特定的slot(槽)关联,而Qt槽实际上就是一个执行特定操作的函数,当收到对应signal时执行这个函数。
由上可知,signal相当于Message,而slot相当于Message的响应函数,消息映射,就是将相应的两者关联起来。
Qt中用来连接signal和slot的是QObject::connect,它有许多重载形式,具体的用到时再记录吧。
2、下面通过一个按钮例子来实现signal和slot:
就以上篇文章的工程为基础,实现目标:
.h文件:
#ifndef SHOWDIALOG_H #define SHOWDIALOG_H #include <QDialog> // 添加文字类 #include <QLabel> // 添加按钮类 #include <QPushButton> namespace Ui { class ShowDialog; } class ShowDialog : public QDialog { Q_OBJECT public: explicit ShowDialog(QWidget *parent = 0); ~ShowDialog(); private: Ui::ShowDialog *ui; public: QLabel * text; // 文本对象 QPushButton * pBtn; // 按钮对象 // 槽函数声明区 public slots: void ChangeText(); // 声明一个槽函数 }; #endif // SHOWDIALOG_H
.cpp文件:
#include "showdialog.h" #include "ui_showdialog.h" ShowDialog::ShowDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ShowDialog) { ui->setupUi(this); // 显示文字 text = new QLabel(this); text->setText("Hello Qt!"); text->show(); // 按钮 pBtn = new QPushButton(this); QRect rc(50,50,100,100); pBtn->setGeometry(rc); // 设置按钮位置 pBtn->setText("Click Me"); // 设置按钮文字 pBtn->show(); // 关联信号与槽函数 connect(pBtn, SIGNAL(clicked()), this, SLOT(ChangeText())); } ShowDialog::~ShowDialog() { delete ui; } // 定义槽函数 void ShowDialog::ChangeText() { text->setText("Here Changed!"); }
运行结果:
点击按钮前:
点击按钮后:
结果:比较可以看到,文字改变了,但是还存在一个问题。问题是点击按钮后文字改变了,但是没有全部显示。
应该显示“Here Changed!”,但是只显示了“Here Chen”。显然,QLabel对象第二次调用setText函数是基于第一次调用的,也就是说第二次调用时文字的长度超出第一次的部分不会显示。
解决方法是,调用setGeometry函数设置显示位置和大小:
// 定义槽函数
void ShowDialog::ChangeText()
{
text->setGeometry(0,0,100,10);
text->setText("Here Changed!");
}
工程源码:http://download.csdn.net/detail/wwkaven/7614031
相关文章推荐
- Qt:QML:QML于C++交互之信号与槽(signal&slot )
- 深入理解QT的SIGNAL\SLOT机制(五):信号的发射过程
- QT信号(signal)和槽(slot)应注意的问题
- Qt信号与槽机制(signal & slot)
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- Qt 初探信号与槽(signal & slot)
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
- 一起看代码来玩玩QT之09 Signal and SLOT ( 信号和槽)
- Java实现Qt的SIGNAL-SLOT机制(保存到Map中,从而将它们关联起来,收到信号进行解析,最后反射调用)
- QT程序实例----信号与插槽(signal and slot)
- qt信号signal和槽slot机制
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- Qt的信号(signal)和槽(slot)机制(讲解很到位)
- QT信号(SIGNAL)与槽(SLOT)
- 信号(Signal)与槽(Slot)-Qt中的典型机制
- C++11 信号槽 signal/slot
- Qt__signal_slot 连接的函数类型
- Qt的signal/slot机制的原理和使用