我有一个类'A',在这个类中有一个方法'method1()'和method1在qthread中运行。在method1中,我想在MainWindow类中调用一个函数,如下所示:'MainWindow window; window.func()'
当我这样做时,我收到此错误消息:QObject :: setParent:无法设置父级,新父级位于不同的线程
这是我的代码:
void gCode_int::parse_File(char* gCode_file, int file_length,MainWindow *window)
{
window->fahre_on_pos(NULL,atoi(x_pos.c_str()),atoi(y_pos.c_str()));
}
这里是MainWindow中的函数:
void MainWindow::fahre_on_pos(char* g_command ,int x_pos, int y_pos)
{
double y_schritte;
double x_schritte;
int j = 1;
int x_length = x_pos-x_pos_old;
int y_length = y_pos-y_pos_old;
digitalWrite(x_treiber,1);
digitalWrite(y_treiber,1);
if(x_length > 0)
{
digitalWrite(x_richtung, 1);
}
if(x_length <= 0)
{
digitalWrite(x_richtung,0);
x_length *= -1;
}
if(y_length > 0)
{
digitalWrite(y_richtung, 0);
}
if(y_length < 0)
{
digitalWrite(y_richtung,1);
y_length *= -1;
}
y_schritte = round((y_length/1.25)*48);
if(y_schritte == 0)
{
y_schritte =1;
digitalWrite(y_treiber,0);
}
if(x_schritte == 0)
digitalWrite(x_treiber,0);
x_schritte = round(((x_length/1.25)*200)/y_schritte);
while(j <= y_schritte)
{
for(int i=1;i<= x_schritte;i++)
{
digitalWrite(x_v, 1);
delay(1);
digitalWrite(x_v, 0);
delay(1);
}
if(x_schritte == 0)
{
digitalWrite(y_v, 1);
delay(4);
digitalWrite(y_v, 0);
delay(4);
}
else
{
digitalWrite(y_v, 1);
delay(1);
digitalWrite(y_v, 0);
delay(1);
}
j++;
}
x_pos_old = x_pos;
y_pos_old = y_pos;
}
希望有人能帮助我
答案 0 :(得分:0)
在MainWindow中创建一个插槽,该插槽从带有信号的线程接收参数并调用方法
答案 1 :(得分:0)
来自http://doc.qt.io/qt-5/threads-qobject.html
虽然QObject是可重入的,但GUI类,尤其是QWidget及其所有子类,都不是可重入的。它们只能在主线程中使用。如前所述,还必须从该线程调用QCoreApplication :: exec()。
实际上,在主线程之外的其他线程中使用GUI类的不可能性可以通过将耗时的操作放在单独的工作线程中并在工作线程为主线程时在主线程中的屏幕上显示结果来轻松解决。完了
信号和插槽应该在工作人员和主窗口之间建立连接,否则如上所述它将无法正常工作