多窗口的通信

   首先将下信号与槽的关系,一个信号可以关联到多个槽上,多个信号也可以关联到一个槽上。如果存在多个槽与某个信号关联,那么,当这个信号被发射时,这些槽就会一个一个执行,但是执行的顺序是随机的,无法指定他们的执行顺序。下来用个多窗体的通信来了解这方面的知识。
      自定义一个信号。只需声明一个signals 关键字,在signals 前面不能用public private protected等字符限制。因为只有定义改信号的类和他的子类才可以发射改信号。信号只用声明,不用实现。信号都是 void类型。

总结就是
在A类中定义一个signal,并且emit 这个数据。在B类中new 一个A类并且用connect函数把,A类和他的signal绑定在B类定义的一个槽上。如下
connect(shWidget,SIGNAL(senopacity(qreal)),this,SLOT(showdata(qreal)),Qt::DirectConnection);并且注意信号与槽的数据类型保持一致,这样才能把数据传到主窗口上。
#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>
#include  "mywidget.h"
namespace Ui {

    class MainWindow;

}


class MainWindow : public QMainWindow
{

    Q_OBJECT

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

public slots:

    void showdata(qreal);

private:

    Ui::MainWindow *ui;

    myWidget *shWidget;


};


#endif // MAINWINDOW_H
------------------------------------------------------------------------------------------------------

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    shWidget = new myWidget();

    connect(shWidget,SIGNAL(senopacity(qreal)),this,SLOT(showdata(qreal)),Qt::DirectConnection);

    //ui->lcdNumber->display("10");
}


MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::showdata(qreal data)

{

 ui->lcdNumber->display(data);

 qDebug()<<data<<"ni mei";

}

/////////////////////////////////////////////////////////////////////////////////////////


#ifndef MYWIDGET_H

#define MYWIDGET_H


#include <QWidget>
#include <QtGui>
#include <QGridLayout>
class myWidget : public QWidget
{

    Q_OBJECT
public:

    explicit myWidget(QWidget *parent = 0);


signals:

   void senopacity(qreal);

private slots:

   void slotValue(int);

private :

   QWidget *smWidget;

};


#endif // MYWIDGET_H
----------------------------------------------------------------------


#include "mywidget.h"
#include <QDebug>

myWidget::myWidget(QWidget *parent) :

    QWidget(parent)

{

    QSlider *mySlider = new QSlider(Qt::Horizontal);

    mySlider->setRange(10,100);

    mySlider->setValue(100);

    connect(mySlider,SIGNAL(valueChanged(int)),this,SLOT(slotValue(int)));

    smWidget = new QWidget();

    QGridLayout *myGridLayout = new QGridLayout();

    myGridLayout->addWidget(mySlider);

    smWidget->setLayout(myGridLayout);

    smWidget->show();

}

void myWidget::slotValue(int value)

{

  qreal opacity = (qreal)(value/100.0);

  setWindowOpacity(opacity);

  qDebug()<<opacity;

  emit senopacity(opacity);

}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值