Qt时隙方法(这是另一类)在发射信号时不触发

Qt slot method (which is another class) not firing when emiting the signal

本文关键字:发射 信号 一类 方法 时隙 Qt      更新时间:2023-10-16

我知道这个问题问了很多次,但仍然很困惑,找不到解决方案。

我有一个主窗口和一个类。

在我的类中,我有一个信号,我在方法调用中发出该信号。

问题:插槽方法未触发。

这是我的代码。

BWorker.h

#pragma once
#include <QObject>
class BWorker : public QObject
{
    Q_OBJECT
public:
    BWorker(QObject *parent);
    ~BWorker();
    void doSomething();
signals:
    void signalSomething();
};

沃克.cpp

#include "BWorker.h"
BWorker::BWorker(QObject *parent)
    : QObject(parent)
{
}
BWorker::~BWorker()
{
}
void BWorker::doSomething() 
{
    emit signalSomething();
}

QtGui申请1.h

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
class QtGuiApplication1 : public QMainWindow
{
    Q_OBJECT
public:
    QtGuiApplication1(QWidget *parent = Q_NULLPTR);
public slots:
    void workDone();
private:
    Ui::QtGuiApplication1Class ui;
};

QtGui应用程序1.cpp

#include "QtGuiApplication1.h"
#include "BWorker.h"
QtGuiApplication1::QtGuiApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    BWorker bworker(this);
    connect(&bworker, SIGNAL(bworker.signalSomething), this, SLOT(workDone()));
    bworker.doSomething();
}
void QtGuiApplication1::workDone() {
}

你的问题在这里:

SIGNAL(bworker.signalSomething)

这是无效的,您应该在终端中看到一条消息,指出没有这样的信号。适合您的情况的正确语法是:

SIGNAL(signalSomething())

请通过复制粘贴来发布您的代码。请勿编辑代码:问题可能出在您编辑的位置

我的代码工作正常。

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void workDone();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "worker.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Worker worker(this);
    connect(&worker, SIGNAL(signalSomething()), this, SLOT(workDone()));
    //connect(&worker, &Worker::signalSomething, this, &MainWindow::workDone);
    worker.doSomething();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::workDone()
{
    qDebug() << "Done.";
}

工人.h:

#ifndef WORKER_H
#define WORKER_H
#include <QObject>
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = 0);
    void doSomething();
signals:
    void signalSomething();
public slots:
};
#endif // WORKER_H

工人.cpp:

#include "worker.h"
Worker::Worker(QObject *parent) : QObject(parent)
{
}
void Worker::doSomething()
{
    emit signalSomething();
}

应用程序输出:

Debugging starts
Done.
Debugging has finished

打印出"完成"表示代码正在工作。