2012-06-15 102 views
1

我有一種奇怪的情況,其中有一個工作線程完成它的工作,然後發出一個信號來回調GUI線程來關閉對話框。是否有人可以解釋爲什麼這個工程:在QT應用程序中沒有接收信號的插槽

的WorkerThread:

[Header] 
signals: 
    void writeComplete(void); 

[Source] 
void startWorkerThread() 
{ 
    // do some stuff in boost::thread 
    emit writeComplete(); 
} 

主窗口的子類:

burnDialog = new QProgressDialog("Writing to disc", "", 0, 0); 
burnDialog ->setCancelButton(0); 
QWidget::connect(discHandler.get(), SIGNAL(writeComplete()), burnDialog, SLOT(close())); 
QWidget::connect(discHandler.get(), SIGNAL(writeComplete()), this, SLOT(close())); 
burnDialog->open(); 
discHandler->startWorkerThread(); 

但這並不:

主窗口的子類: [標題] 公衆插槽: void closeWithDialog(void);

[Source] 
burnDialog = new QProgressDialog("Writing to disc", "", 0, 0); 
QWidget::connect(discHandler.get(), SIGNAL(writeComplete()), this, SLOT(closeWithDialog())); 
burnDialog ->setCancelButton(0); 
burnDialog->open(); 
discHandler->startWorkerThread(); 

void closeWithDialog() 
{ 
    burnDialog->close(); 
    close(); 
} 
+0

是否[此答案](http://stackoverflow.com/a/2074064/894321)解決您的問題? – alexisdm

回答

3

感覺就好了...我沒有把Q_OBJECT在頭文件。我認爲子類繼承了QMainWindow這一事實,即Q_OBJECT接口也將被隱含繼承。但它不是......感謝無論如何幫助傢伙!

0

這裏是故障線路不能正常工作的情況下

QWidget::connect(discHandler.get(), SIGNAL(writeComplete()), burnDialog, 
        SLOT(closeWithDialog())); 

你分配一個SLOTburnDialog情況下,這意味着closeWithDialog()方法必須是QProgressDialog類的。 QProgressDialog沒有任何這樣的方法。您應該檢查了以下消息控制檯:

Object::connect: No such slot QProgressDialog::closeWithDialog() 

更改上述故障線路爲以下幾點:

QWidget::connect(discHandler.get(), SIGNAL(writeComplete()), this, 
        SLOT(closeWithDialog())); 
+0

感謝您的支持。不幸的是,這只是Ctrl + C和Ctrl + V:p的錯誤。在實際的代碼中,我確實有'QWidget :: connect(discHandler.get(),SIGNAL(writeComplete()),this,SLOT(closeWithDialog()));' –

+0

Ohh太棒了.. :)好吧,編輯「的問題馬上。另外,我希望你檢查你沒有在控制檯中收到任何'connect'失敗的消息。 – Ammar