如何从非qt类向qt类发送信号?

如何从非qt类向qt类发送信号?,qt,Qt,我创建了一个qt类,只是为了制作gui,并在gui上显示数据 我不想冻结gui,这就是为什么我创建了另一个非qt类来执行操作,所以我在非qt类的gui类中创建了一个对象,并在其中传递参数,然后在新线程中启动它 现在,在完成操作之后,我想通知gui类,以便它可以显示结果 我还想访问gui类的状态栏,这样当非qt类执行操作时,它可以在gui上显示一些消息 (我用qt类试过了,但没有成功,这就是我创建非qt类的原因。.使用非qt类,线程部分工作正常,但信号部分不工作,因此我无法通知gui类) 因此,请

我创建了一个qt类,只是为了制作gui,并在gui上显示数据

我不想冻结gui,这就是为什么我创建了另一个非qt类来执行操作,所以我在非qt类的gui类中创建了一个对象,并在其中传递参数,然后在新线程中启动它

现在,在完成操作之后,我想通知gui类,以便它可以显示结果

我还想访问gui类的状态栏,这样当非qt类执行操作时,它可以在gui上显示一些消息

(我用qt类试过了,但没有成功,这就是我创建非qt类的原因。.使用非qt类,线程部分工作正常,但信号部分不工作,因此我无法通知gui类)


因此,请帮助我了解如何从非qt类向qt类发送信号???

信号是一个仅适用于从
QObject
派生的类的概念

如果你想触发一个插槽,你不需要信号。如果接收对象位于同一线程中(,并且只有在该线程中,),则可以直接调用接收对象上的slot方法

例如,给定一个带有插槽的GUI对象实例:

MainWindow * mainWindow;

class MainWindow : public QWidget {
  Q_OBJECT
  ...
  Q_SLOT void setStatus(const QString &);
  ...
};
您可以简单地执行以下操作:

// The assert is essential to prevent bad bugs. If it triggers,
// you must use `QMetaObject::invokeMethod` instead.
Q_ASSERT(mainWindow->thread() == QThread::currentThread());
mainWindow->setStatus("Finished");
如果接收对象可能位于另一个线程中,或者您不想担心线程问题,则必须使用
QMetaObject::invokeMethod
,如下所示:

// This is always safe. No need for asserts.
QMetaObject::invokeMethod(mainWindow, "setStatus",
                          Q_ARG(QString, "Finished"));

invokeMethod
的重载将根据接收对象是否在同一线程中运行而正确选择连接类型。如果接收方在同一线程中,则该调用为直接调用。如果它在另一个线程中运行,则调用将转换为
QMetaCallEvent
,并发布到接收对象。这是线程安全的,不要求接收对象的
setStatus
方法是线程安全的。

这是不可能的,发送方必须是QObject。“我在qt类中尝试过,但没有成功,这就是我创建非qt类的原因”什么不起作用?线程部分不能与qt类一起工作。实际上,首先我用qt类尝试了它,正如你告诉它应该是QObject,但QObject sender在moc文件中显示了一些错误,该文件是在编译时生成的,当我删除Q_对象线程正在工作时,但信号部分不工作添加有关该错误的更多详细信息。编译时的moc不知道(运行时)线程,所以我看不到编译时可能出现的任何问题。我找到了答案。我必须创建一个qt类,并从Qthread派生它,而不是使用非qt类。。在该qt类中,我必须声明一个信号,以便在操作完成时发出。我应该在gui类中编写一个连接函数来捕获发出的信号。当发出信号时,我可以编写在相应发出信号的插槽中显示输出的代码。。