首先将下信号与槽的关系,一个信号可以关联到多个槽上,多个信号也可以关联到一个槽上。如果存在多个槽与某个信号关联,那么,当这个信号被发射时,这些槽就会一个一个执行,但是执行的顺序是随机的,无法指定他们的执行顺序。下来用个多窗体的通信来了解这方面的知识。
自定义一个信号。只需声明一个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); }
1913

被折叠的 条评论
为什么被折叠?



