2015-07-11 109 views
0

我有一個類'A',在這個類中有一個方法'method1()'和method1在qthread中運行。在method1中,我想調用MainWindow類中的函數,如下所示:'MainWindow window; window.func()」Qt線程調用函數

當我這樣做,我收到此錯誤信息: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())); 
} 

在這裏,在主窗口的功能:

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

http://doc.qt.io/qt-5/threads-qobject.html

雖然QObject的是可重入的,所述GUI類,特別是QWidget的和所有它的子類,不可重入。他們只能從主線程使用。如前所述,QCoreApplication :: exec()也必須從該線程中調用。

實際上,在主線程之外的其他線程中使用GUI類的不可能性可以通過在獨立的工作線程中放置耗時的操作並在工作線程中在主線程的屏幕上顯示結果完成

信號和槽應該讓工人和主窗口之間的連接器,否則說明它不會工作