2014-01-25 39 views
2

我创建了一个qt类,仅用于制作gui并在gui上显示数据。如何从qt类发送信号给qt类?

我不想冻结这就是为什么我创造了另一个non_qt类来执行操作的图形用户界面,所以我在GUI类non_qt类的做了一个对象,并传递参数在和一个新的线程启动它。

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

我也想访问,所以当non_qt类执行它可以显示在GUI中的某些消息的操作GUI类的状态栏..

(我试过用QT类,但它没有工作,可能会为什么我创建non_qt类..with non_qt类的线程部分工作正常,但信号部分不工作,所以我无法通知贵班)。

所以请帮助我如何发送信号到qt类从不qt类?????

+0

这不可能,发件人必须是Q​​Object。 “我用qt类试过了,但它没有工作,这就是为什么我创建non_qt类”什么都不起作用? –

+0

线程部分没有与qt类一起工作..实际上我先用qt类试过它,因为你告诉它应该是一个QObject,但是使用QObject发件人时,它在编译时生成的moc文件中显示一些错误,当我删除Q_object线程时工作但信号部分不起作用 – user3114019

+0

添加有关该错误的更多详细信息。 moc在编译时并不知道(运行时)线程,因此我没有看到编译时可能出现的任何问题。 –

回答

2

该信号是一个概念,只适用于派生自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方法是线程安全的。