為什么網(wǎng)站需要維護(hù)怎樣免費推廣自己的網(wǎng)站
connect(信號發(fā)送者,發(fā)送的信號,信號接收者,信號的處理);
信號函數(shù)和槽函數(shù)的參數(shù)必須是一樣的,但信號的參數(shù)可以多余槽函數(shù)的參數(shù)(前面的參數(shù)類型必須一致)
是控件和控件間的信號傳遞,這兩個之間沒有關(guān)聯(lián),松散耦合
兩個連接意義相同,用父類的(發(fā)送的信號,或信號的處理(要地址))或自己類名都可以
//自定義類MyButton 繼承QPushButton
MyButton *but=new MyButton;
but->setText("hhh");
but->setParent(this);
connect(but,&MyButton::clicked,this,&MainWindow::close);
connect(but,&QPushButton::clicked,this,&QMainWindow::close);
自定義信號和槽
自定義信號://不用在.cpp里實現(xiàn)faSingnals();
.h
class fasong : public QObject
{Q_OBJECT
public:explicit fasong(QObject *parent = nullptr);signals:
//自定義信號//沒有返回值的只需要聲明不需要實現(xiàn),可以有參數(shù)可以重載//信號函數(shù)void faSingnals();void faSingnals(QString string);
};
自定義槽:
.h
class jieshou : public QObject
{Q_OBJECT
public:explicit jieshou(QObject *parent = nullptr);signals:public slots://槽函數(shù)//返回void 需要聲明和實現(xiàn),可以有參數(shù)可以重載//槽函數(shù)void shouSlots();void shouSlots(QString string);
};
//需要在.cpp里實現(xiàn)shouSlots()函數(shù);
#include "jieshou.h"
#include <QtDebug>
jieshou::jieshou(QObject *parent) : QObject(parent)
{}
void jieshou::shouSlots()
{qDebug()<<"你好";
}
void jieshou::shouSlots(QString string)
{//先toUtf8()轉(zhuǎn)成ByteArray在.data()轉(zhuǎn)成char*()//輸出的字符串不帶引號qDebug()<<string.toUtf8().data();
}
可以理解為這里的主函數(shù):調(diào)用信號和槽
.h
#include"fasong.h"
#include"jieshou.h"
#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;///觸發(fā)信號void chuFa();///信號對象fasong *fa;///槽對象jieshou *shou;
};
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include "MyButton.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//發(fā)送者對象this->fa=new fasong(this);//接收者對象this->shou=new jieshou(this);//連接信號與槽//connect(fa,&fasong::faSingnals,shou,&jieshou::shouSlots);//信號與槽有重載時的連接方法//函數(shù)指針指向函數(shù)地址void(fasong:: *faSongDiZhi)(QString)=&fasong::faSingnals;void(jieshou:: *jieshouDiZhi)(QString)=&jieshou::shouSlots;//連接信號與槽(有參)connect(fa,faSongDiZhi,shou,jieshouDiZhi);//實現(xiàn)點擊按鈕觸發(fā) 觸發(fā)信號QPushButton *button=new QPushButton;button->setParent(this);button->setText("Button1");//綁定按鈕點擊觸發(fā)觸發(fā)信號connect(button,&QPushButton::clicked,this,&MainWindow::chuFa);void(fasong:: *faSongDiZhi1)(void)=&fasong::faSingnals;void(jieshou:: *jieshouDiZhi1)(void)=&jieshou::shouSlots;//信號連接信號connect(button,&QPushButton::clicked,fa,faSongDiZhi1);//發(fā)送和接收連接(無參)信號和槽連接connect(fa,faSongDiZhi1,shou,jieshouDiZhi1);//斷開信號,怎么連接就怎么斷開disconnect(button,&QPushButton::clicked,fa,faSongDiZhi1);chuFa();}///觸發(fā)信號
void MainWindow::chuFa()
{//emit觸發(fā)關(guān)鍵字,faSingnals為信號函數(shù)//emit fa->faSingnals();emit fa->faSingnals("哈哈哈");
}MainWindow::~MainWindow()
{delete ui;
}
輸出:
//有參 connect(fa,SIGNAL(faSingnals(QString)),shou,SLOT(shouSlots(QString)));//無參 connect(fa,SIGNAL(faSingnals()),shou,SLOT(shouSlots()));不建議使用