Chinaunix首页 | 论坛 | 博客
  • 博客访问: 365574
  • 博文数量: 36
  • 博客积分: 2071
  • 博客等级: 大尉
  • 技术积分: 797
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 12:08
文章分类
文章存档

2011年(2)

2010年(34)

我的朋友

分类: C/C++

2010-11-23 09:14:01

 
Qt信号与槽及标准对话框
信号和槽:
信号:一个特定的标识,当内部发生某些事件或状态改变时能够被“发射”如:emit singal();
槽:槽和普通的c++类几乎是一样的
唯一的不同的是:槽可以和信号连接在一起,当发射这个信号的时候,就会自动调用这个槽
对象之间通信的高级接口
信号与槽的连接
基本语句:
QObject::connect(a,SIGNAL(a_signal(int)),b,SLOT(b_slot(int)),Qt::ConnectiopnType)
其中:Qt::ConnectionType定义了关联方式:
1、Qt::DirectConnection
2、Qt::QueuedConnection
3、Qt::AutoConnection (默认)
其他相关联模式:
一个信号可以连接多个槽(顺序任意)
多个信号可以连接一个槽
一个信号可以与另外一个信号相连连接
注意点:
a_signal和b_slot 中只能有参数类型,而非具体的值,且类型为Qt已知的类型
要把信号成功连接到槽或另一个信号,它们的参数必须具有相同的顺序和类型
如果信号参数比槽多,多余的参数将被忽略
 

#include "singall.h"
#include "ui_singall.h"

singall::singall(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::singall)
{
    ui->setupUi(this);
    connect(ui->showButton,SIGNAL(clicked()),ui->label,SLOT(show()));
    connect(ui->hideButton,SIGNAL(clicked()),ui->label,SLOT(hide()));
    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->progressBar,SLOT(setValue(int)));
    connect(ui->quitButton,SIGNAL(clicked()),this,SLOT(close()));
}

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

 

 
 
手动实现:
 
 
 
 
ctrl+r 编译后:
 
 
 
 
下面是自定义信号和槽:
代码实现:
 

#include "singall.h"
#include "ui_singall.h"
#include <Qdebug>
singall::singall(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::singall)
{
    ui->setupUi(this);
    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(mySlot(int)));
    connect(this,SIGNAL(mySignal(int)),ui->progressBar,SLOT(setValue(int)));
}

singall::~singall()
{
    delete ui;
}
void singall::mySlot(int a)
{
    ui->label->setText(QString::number(a));
    if( a == 87)
    {
        qDebug()<<"a=87";
        emit mySignal(10);
    }
}


#ifndef SINGALL_H
#define SINGALL_H

#include <QWidget>

namespace Ui {
    class singall;
}

class singall : public QWidget
{
    Q_OBJECT

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

private:
    Ui::singall *ui;
signals:
//自定义信号

    void mySignal(int);
//写号一个信号

private slots:
//槽

    void mySlot(int);
//写好一个槽

};

#endif
// SINGALL_H


一种系统自动进行生成函数的方法:
 
 
点击OK按钮
void signal2::on_pushButton_clicked()
{
    写入你想控制的槽或信号;
}
这样就创建了一个不用connect函数连接的系统函数
 
 
QTimer定时器
 
QTimer *timer = new QTimer(this);
timer->start(1000);//1000是一秒
也就是每隔1s发送一个timeout()信号
 
此例可以说明:

#ifndef DISPLAY1_H
#define DISPLAY1_H

#include <QWidget>
#include <QTimer>
namespace Ui {
    class display1;
}

class display1 : public QWidget
{
    Q_OBJECT

public:
    explicit display1(QWidget *parent = 0);
    ~display1();
      int num;
private:
    Ui::display1 *ui;
    QTimer *timer;

private slots:
    void dispayer();
    void on_pushButton_2_clicked();
    void on_pushButton_clicked();
};

#endif // DISPLAY1_H


#include "display1.h"
#include "ui_display1.h"
#include <QTimer>

display1::display1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::display1)
{
    num = 10;
    ui->setupUi(this);
    timer = new QTimer(this);
    timer->start(1000);
    connect(this->timer,SIGNAL(timeout()),this,SLOT(dispayer()));
}

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

void display1::on_pushButton_clicked()
{
    timer->stop();
}

void display1::on_pushButton_2_clicked()
{
    timer->start();
}
void display1::dispayer()
{
    num--;
    if(0 == num)
    {
      num =10;
    }
    ui->lcdNumber->display(num);
}

 

 

 

 

效果图

#include "display1.h"
#include "ui_display1.h"
#include <QTimer>

display1::display1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::display1)
{
    num = 10;
    ui->setupUi(this);
    timer = new QTimer(this);
    timer->start(1000);
    connect(this->timer,SIGNAL(timeout()),this,SLOT(dispayer()));
}

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

void display1::on_pushButton_clicked()
{
    timer->stop();
    ui->pushButton->setEnabled(false);
    ui->pushButton_2->setEnabled(true);
}

void display1::on_pushButton_2_clicked()
{
    timer->start();
    ui->pushButton->setEnabled(true);
    ui->pushButton_2->setEnabled(false);
}
void display1::dispayer()
{
    num--;
    if(0 == num)
    {
      num =10;
    }
    ui->lcdNumber->display(num);
}



阅读(3449) | 评论(0) | 转发(0) |
0

上一篇:QT

下一篇:QT小游戏

给主人留下些什么吧!~~