在官方Qt文档中:
如上所述,每个程序在启动时都有一个线程。该线程称为“主线程”(在Qt应用程序中也称为“GUI线程”)。 Qt GUI必须在此线程中运行。所有小部件和几个相关的类(例如QPixmap)在辅助线程
中不起作用
现在,在qt项目中,我尝试了以下代码:
QThread* thread = new QThread;
DetectList *list = new DetectList;
list->moveToThread(thread);
connect(thread, SIGNAL(started()), list, SLOT(process()));
thread->start();
其中DetectList是由QWidget派生的类。为什么代码编译并运行? DetectList不一定只能在主线程中运行吗?
答案 0 :(得分:2)
就像Laszlo Papp指出你正在接受战争而moveToThread
没有效果。战争会说:
QObject::moveToThread: Widgets cannot be moved to a new thread
请参阅source code of moveToThread。
我建议你描述一下你正在尝试做什么以及为什么你需要线程。我很确定有更好的解决方案(比如Qt Concurrent)。
答案 1 :(得分:1)
该程序将编译并运行,因为从C++
正文中它在语法上是正确的。
Qt
文档说的是,在与主线程不同的线程中运行GUI相关代码是不正确的,如果发生这种情况,那么应用程序可能会在运行时崩溃。
在您之前的代码中,例如,如果DetectList
对象正在与某个GUI元素进行交互,那么您的程序将崩溃:
// If the process implementation interacts with GUI elements then the application will crash
void DetectList::process()
{
// a simple gui interaction
checkBox->setChecked(true);
}