2012-06-15 69 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