我正在编写一个DLL,它被另一个应用程序用作插件,并希望利用Qt的能力。
我已经设置,编译和运行所有类,但没有发出任何信号。
所以似乎没有QEventLoop。
尝试1:
我将我的主类修改为子类QThread而不是QObject,并在run()中创建一个QEventLoop,连接所有信号/槽,并执行线程。
但它没有说没有QApplication就没有QEventLoop。
尝试2:
我修改了主类(仍然继承了QThraed)而不是实例化QCoreApplication,连接所有信号/插槽,然后执行应用程序。
警告说QApplication不是在main()线程中创建的,但仍然不会发出信号。
我不确定该怎么做。我显然无法在将使用我的插件的应用程序中创建QCoreApplication,并且我无法在没有插件的情况下发出信号。
我已经包含了一个简单的(并且可怕写的)测试应用程序,它应该说明我的问题:
任何帮助将不胜感激!
main.cpp中:
#include <iostream>
#include "ThreadThing.h"
using namespace std;
int main(int argc, char *argv[])
{
cout << "Main: " << 1 << endl;
ThreadThing thing1;
cout << "Main: " << 2 << endl;
thing1.testStart();
cout << "Main: " << 3 << endl;
thing1.testEnd();
cout << "Main: " << 4 << endl;
thing1.wait(-1);
cout << "Main: " << 5 << endl;
return 0;
}
ThreadThing.h:
#ifndef THREADTHING_H
#define THREADTHING_H
#include <QThread>
class ThreadThing : public QThread
{
Q_OBJECT
public:
ThreadThing();
virtual void run();
void testStart();
void testEnd();
public slots:
void testSlot();
signals:
void testSignal();
};
#endif//THREADTHING_H
ThreadThing.cpp:
#include "ThreadThing.h"
#include <iostream>
#include <QCoreApplication>
using namespace std;
ThreadThing::ThreadThing()
{
cout << "Constructor: " << 1 << endl;
this->start();
cout << "Constructor: " << 2 << endl;
}
void ThreadThing::run()
{
cout << "Run: " << 1 << endl;
int i = 0;
cout << "Run: " << 2 << endl;
QCoreApplication* t = new QCoreApplication(i, 0);
cout << "Run: " << 3 << endl;
connect(this, SIGNAL(testSignal()), this, SLOT(testSlot()), Qt::QueuedConnection);
cout << "Run: " << 4 << endl;
t->exec();
cout << "Run: " << 5 << endl;
}
void ThreadThing::testStart()
{
cout << "TestStart: " << 1 << endl;
emit testSignal();
cout << "TestStart: " << 2 << endl;
}
void ThreadThing::testEnd()
{
cout << "TestEnd: " << 1 << endl;
this->quit();
cout << "TestEnd: " << 1 << endl;
}
void ThreadThing::testSlot()
{
cout << "TEST WORKED" << endl;
}
输出:
Main: 1
Constructor: 1
Constructor: 2
Main: 2
TestStart: 1
TestStart: 2
Main: 3
TestEnd: 1
TestEnd: 1
Main: 4
Run: 1
Run: 2
WARNING: QApplication was not created in the main() thread.
Run: 3
Run: 4
答案 0 :(得分:5)
您有来创建QCoreApplication或QApplication,而 在主线程中执行此操作。
这并不意味着你不能在你的插件中添加代码...除非应用程序总是在自己的线程中运行每个插件。
如果应用程序 这样做,那么您可以尝试连接到应用程序使用的任何本机事件循环,并安排它在主线程中调用插件中的某些函数。
答案 1 :(得分:1)
我成功创建了一个QCoreApplication并在后台线程上运行它。这是不标准实现,但可以用于简单的信号/插槽功能。我为具有大量遗留Qt代码库的原生iOS应用程序做了这个。
//I really don't do anything but run on a background thread
class MyQtAppForBackgroundThread : public QCoreApplication
{
Q_OBJECT
...
}
//iOS specific code here...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(void){
// This spawns a QCoreApplication on a background thread in an attempt to create something that can
// queue signals across threads
qtApp = new MyQtAppForBackgroundThread(smArgc, smArgv);
qtApp->exec();
});
将捕获在连接它们的同一线程上触发的信号。要捕获不同线程上的信号,您必须在创建信号的线程上创建并轮询QEventLoop。
//Fire me periodically on the thread the signals and slots were connected
QEventLoop loop;
loop.processEvents( QEventLoop::ExcludeUserInputEvents, 500 );