QT信号与槽

一、信号与槽的概念

信号:在特定条件下发生的事件,例如QPushButton的基类中的QAbstractButton中的onclick()信号,当电机QPushButton时就会产生信号,其他的信号还有按下,抬起等信号

槽:对信号响应的函数,不使用信号与槽时,与普通函数用法一致

信号与槽的连接:使用函数connect

QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

1.const QObject *sender  :: 信号发送的对象

2.const char *signal  ::发出的信号

3.const QObject *receiver  ::信号接收对象

4.const char *method   ::接收对象的槽函数

5.Qt::ConnectionType type = Qt::AutoConnection  ::连接类型 一般默认就好

函数自带的信号,可以通过QTcreator进行查找,以下时button的自带的信号与槽函数

1.如何使用

在ui中拖入QPushBotton和QTextEdit

主要实现的目标是,点击按钮时,文本框打出"HelloWord"

这里我们使用的是自定义的槽函数onclick()

我们将我们创建的button按钮的clicked信号与这个窗口类相连接,在触发clicked信号时会去调用我们写的onclick()函数,函数功能是在textEdit中添加"HelloWord"

执行后如下:

接下来测试一下按钮的另两个信号,按下和抬起,想要的效果是按下在文本框中输出“按钮按下”,抬起输出"按钮抬起",函数如下:

二、自定义信号与自定义槽

自定义槽:

1、在自定义槽的时候一定要确保该对象继承自QOBject或QOBject的子类,并且在类声明中加上Q_OBJECT宏

2、声明定义与普通的函数一样

自定义信号:

1、在自定义信号时一定要确保该对象继承自QOBject或QOBject的子类,并且在类声明中加上Q_OBJECT宏

2、在定义信号时,只需要写个信号声明函数,并不需要写定义,写法与函数类似,注意返回值一定是void

发送信号:
1、当信号满足条件是,我们就需要发送信号

emit 信号名(参数);

2、信号传递的参数会传给槽对应的参数,因此信号与槽的参数个数和类型要相同

自定义信号方法如下:                          自定义槽:

现在我希望实现一个信号类和槽函数,完成在终端打印Hello ,并打印我通过信号传送的值

定义:

//自定义槽的类
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public slots:
    void printslot();//槽函数
    void printslot(int value);

private:
    Ui::MainWindow *ui;
};

//自定义信号的类
class mySignal:public QObject
{
    Q_OBJECT
public:
    void sendmysignal();//发送信号的函数
    void sendmysignal(int value);
signals:
    void mysignals();//信号,不需要定义
    void mysignals(int value);
};

函数实现:

void MainWindow::printslot(){
    qDebug()<<"Hello";
}
void MainWindow::printslot(int value){
    qDebug()<<"print value ::"<<value;
}

void mySignal::sendmysignal(){
    emit mysignals();
}
void mySignal::sendmysignal(int value){
    emit mysignals(value);
}
主函数
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    mySignal s;
    QObject::connect(&s,SIGNAL(mysignals()),
                     &w,SLOT(printslot()));
    QObject::connect(&s,SIGNAL(mysignals(int)),
                     &w,SLOT(printslot(int)));
    s.sendmysignal();
    s.sendmysignal(5);
    w.show();
    return a.exec();
}

执行

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值