qt两个类之间自定义信号槽

本文通过一个Qt应用程序实例,讲述了如何处理类之间的自定义信号槽通信问题,尤其是在类互相包含的情况下如何避免错误。重点在于理解信号槽的工作原理,确保在内存中有对象能接收到信号并执行相应的槽函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候我们可能遇到一个问题,我们想在A类里面定义一个事件,当这个事件被触发之后,它可以发射一个信号出来,让B,C,D类等其他类去执行一个功能,这些执行功能的类可能是一个QWidget类,或者是一个普通的类,我们可能遇到的问题是怎么让一个信号和槽跨越几个类?

最难的是,如果这些类之间有相互include的关系,比如A中的按钮单击之后,打开了B窗口,因此A类必须include B的头文件。而如果要利用A类发射其他信号来更改B类的一些特性,就需要在B类建立一个信号槽,而且B类要include A类的头文件,以使得信号槽的发送者可以查到。

从一个简单的例子开始讲起:
我们在VS中新建一个基于QMainwindow的工程,名为qt_signal_test,然后在Mainwindow中添加一个按钮,运行后界面为:
这里写图片描述

///////////////////////   main.cpp     ///////////////////////////////////
#include "qt_signal_test.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qt_signal_test w;
    w.show();
    return a.exec();
}
////////////////////         qt_signal_test.h        /////////////////////////////
#ifndef QT_SIGNAL_TEST_H
#define QT_SIGNAL_TEST_H

#include <QtWidgets/QMainWindow>
#include "ui_qt_signal_test.h"
#include "qpushbutton.h"
#include "qlabel.h"

class qt_signal_test : public QMainWindow
{
    Q_OBJECT

public:
    qt_signal_test(QWidget *parent = 0);
    ~qt_signal_test();
    QPushButton *button;
    QLabel *label;

private:
    Ui::qt_signal_testClass ui;
};

#endif // QT_SIGNAL_TEST_H
////////////////////        qt_signal_test.cpp     /////////////////////////////
#include "qt_signal_test.h"

qt_signal_test::qt_signal_test(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    this->setGeometry(200, 200, 400, 400);
    button = new QPushButton(this);
    label = new QLabel(this);
    button->setGeometry(50, 50, 60, 30);
    label->setGeometry(100, 100, 60, 30);
    button->setText(QString::fromLocal8Bit("确定"));
    label->setText(QString::fromLocal8Bit("等待"));
}

qt_signal_test::~qt_signal_test()
{

}

我们新建一个关于button的槽函数,单击一次,label的文本就变化了。

////////////////////         qt_signal_test.h       //////////////////////////////
#ifndef QT_SIGNAL_TEST_H
#define QT_SIGNAL_TEST_H

#include <QtWidgets/QMainWindow>
#include "ui_qt_signal_test.h"
#include "qpushbutton.h"
#include "qlabel.h"

class qt_signal_test : public QMainWindow
{
    Q_OBJECT

public:
    qt_signal_test(QWidget *parent = 0);
    ~qt_signal_test();
    QPushButton *button;
    QLabel *label;

private:
    Ui::qt_signal_testClass ui;

public slots:
    void changeMyText();
};

#endif // QT_SIGNAL_TEST_H
////////////////////        qt_signal_test.cpp     /////////////////////////////
#include "qt_signal_test.h"

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值