QT6 - signal/slot 介于 2 类 之间

QT6 - signal/slot between 2 classes

我为 qpushbutton 创建了一个新的 class,我试图在这个 class 和我的主窗口 class

之间建立信号槽通信
connect(&MyPushButton, &pushbutton::pb_isChecked, this, &MainWindow::MainWindowPBClicked, Qt::DirectConnection);

我使用了这段代码,但仅作为输出

qDebug("pushButtonClicked");

我可以得到这个输出。之后,我用“emit”调用的插槽不起作用。

void pushbutton::pushButtonClicked()
{

    if (isChecked())
    {
        qDebug("pushButtonClicked");
        **emit pb_isChecked();**
    }
}

我项目中的所有代码;

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow ui;
    ui.show();

    return app.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include "pushbutton.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void MainWindowPBClicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    pushbutton MyPushButton;
    connect(&MyPushButton, &pushbutton::pb_isChecked, this, &MainWindow::MainWindowPBClicked, Qt::DirectConnection);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::MainWindowPBClicked()
{
    qDebug("MainWindowPBClicked");
}

pushbutton.h

#ifndef PUSHBUTTON_H
#define PUSHBUTTON_H

#include <QWidget>
#include <QPushButton>

class pushbutton : public QPushButton
{
    Q_OBJECT
public:
    explicit pushbutton(QWidget *parent = nullptr);

public slots:
    void pushButtonClicked();
signals:
    void pb_isChecked();


};

#endif // PUSHBUTTON_H

pushbutton.cpp

#include "pushbutton.h"
#include "mainwindow.h"

pushbutton::pushbutton(QWidget *parent)
    : QPushButton{parent}
{
    setAcceptDrops(true);
    connect(this, &QPushButton::clicked, [this]() {
        pushButtonClicked();
    });
}

void pushbutton::pushButtonClicked()
{

    if (isChecked())
    {
        qDebug("pushButtonClicked");
        emit pb_isChecked();
    }
}

案例 1:未在 UI 文件中创建按钮: 在您的 class MainWindow 中,变量 MyPushButton 是一个局部变量,它在构造函数中结束其作用域后被销毁。您需要像这样创建一个 pushButton 的动态变量:

pushbutton *MyPushButton = new pushButton(this);
connect(MyPushButton, SIGNAL(pb_isChecked()), this, SLOT(MainWindowPBClicked()), Qt::DirectConnection);

案例 2:在 UI 文件中创建按钮: 在这种情况下,您不能使用自定义信号 pb_isChecked()。您将需要使用标准 QPushButton 信号,例如 clicked()

connect(ui->MyPushButton, SIGNAL(clicked()), this, SLOT(MainWindowPBClicked()), Qt::DirectConnection);