该信号是一个概念,只适用于派生自QObject
的类。
如果你想触发一个插槽,你不需要信号。如果接收对象位于同一个线程中(,然后是),则可以直接调用reciving对象上的插槽方法。
例如,假设有一个插槽中的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类试过了,但它没有工作,这就是为什么我创建non_qt类”什么都不起作用? –
线程部分没有与qt类一起工作..实际上我先用qt类试过它,因为你告诉它应该是一个QObject,但是使用QObject发件人时,它在编译时生成的moc文件中显示一些错误,当我删除Q_object线程时工作但信号部分不起作用 – user3114019
添加有关该错误的更多详细信息。 moc在编译时并不知道(运行时)线程,因此我没有看到编译时可能出现的任何问题。 –