您的位置:首页 > 编程语言 > Qt开发

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文件:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: