... 总之,我有一个类“sapp”,它有另一个静态类“tobj”作为静态成员。为了避免静态顺序初始化失败,在sapp的方法中声明了tobj,然后返回tobj实例的指针。 我的问题是,tobj有一个应该在构造函数中启动的计时器,而tobj可能是由非主线程创建的。 QTimer不能由主线程以外的线程启动(或者没有事件循环的线程)。因为这个原因,我通过QMetaObject :: invokeMethod + Qt :: QueuedConnection调用QTimer :: start来避免线程问题,但是它不起作用,QTimer :: start从不被调用。我调查了一下这个问题,看起来像,QTimer :: start没有被调用,因为QTimer的父(在这种情况下是tobj)被声明为静态的。如果我将tobj声明为非静态成员,则一切正常。当...从静态类和非主线程调用时,QMetaObject :: invokeMethod不起作用...
我不太了解Qt的内部,这可能是一个错误,或者我做错了什么?
下面的代码:
class tobj : public QObject
{
Q_OBJECT
QTimer timer;
private slots:
void timeout();
public:
tobj();
};
class sapp : public QObject
{
Q_OBJECT
public:
static tobj* f();
};
void tobj::timeout()
{
qDebug() << "hi";
}
tobj::tobj()
{
connect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
timer.setInterval(500);
qDebug() << QMetaObject::invokeMethod(&timer, "start", Qt::QueuedConnection); // returns true, but never invoked.
}
tobj* sapp::f()
{
static tobj ff;
return &ff;
}
下面就来测试项目的链接,其中包括1头和1个CPP文件http://dl.dropbox.com/u/3055964/untitled.zip
我Qt的4.8.0和MSVC 2010
测试非常感谢您的帮助,非常感谢。