2010-03-23 22 views
2

我有一个的QMainWindow显示了QDialog:无法连接的QMainWindow和QDialog的

CalibrationDialog d(this); 
d.exec(); 

我的QMainWindow类有一个信号:

signals: 
void PenOn(QPoint p); 

而且QDialog的有槽:

public slots: 
void on_PenON(QPoint p); 

我试图连接PenOn事件on_PenOn在两个方面:

  1. 实例化了QDialog

    void MainWindow::on_actionC_triggered() 
    { 
    appState = CALIBR; 

    CalibrationDialog d(this); 
    connect(this, SIGNAL(PenOn(QPoint)), &d,SLOT(on_PenOn(QPoint))); 
    d.exec(); 
    } 
  • 在QDialog的构造
  • 
        CalibrationDialog::CalibrationDialog(QWidget *parent) : 
         QDialog(parent), 
         ui(new Ui::CalibrationDialog) 
        { 
         ui->setupUi(this); 
    
         [...] 
    
         connect(parent, SIGNAL(PenOn(QPoint)), this,SLOT(on_PenOn(QPoint))); 
        } 
    

    无的这个作品:(。 我从另一个线程激活的MainWindow插槽发出PenOn信号。

    我在做什么错?

    +0

    不Qt的打印任何东西了,当您尝试进行连接?它说什么? (您可能需要建立在调试模式以获得打印输出。)我认为这只是在第一时间问题的错字,但我现在看到你申报你的插槽为“on_PenON”(以一个大写的最终N)和尝试使用它作为“on_PenOn”(小写的最后n)。如果这与代码中的相同,那就是问题所在,因为信号/插槽区分大小写。 – 2010-03-27 14:22:13

    +0

    对不起,但我不记得,我没有旧的代码,我试图用适当的功能再次做它,它不工作。我不记得任何错误消息(来自编译器) - 一切都是在调试模式下完成的。 – bartek 2010-03-29 11:40:27

    +1

    只是要清楚的事情,QT在调试模式下可当它试图在运行程序*连接到信号*打印出一条消息,而不是当你编译它。连接被视为运行时事物,因此即使连接不正确,编译也会成功。除此之外,我没有想法。 – 2010-03-30 14:02:38

    回答

    0

    我认为你需要使用一个阻塞直接连接,但要知道,该槽将在主窗口的线程中执行:

    connect(this, SIGNAL(PenOn(QPoint)), &d, SLOT(on_PenOn(QPoint)), Qt::BlockingQueuedConnection);

    更多信息,请参见http://qt.nokia.com/doc/4.5/qt.html#ConnectionType-enum

    对于connect方法使用默认Qt :: ConnectionType的问题是,由于对象在不同的​​线程中,只有当对话线程返回到它的主循环时才会调用该插槽,该操作只发生在d.exec()循环完成。

    +0

    不幸的是,这不起作用。我有点困惑exec()方法。当exec被触发时,父窗口仍然接收和处理来自工作线程的信号(没关系),所以我不明白为什么对话窗口没有接收到主窗口信号。 !中 一些调试后/ * \内部 */ 空隙QMetaObject ::激活 如果((发送者> d_func() - > connectedSignals [n]的&M)== 0)// 没什么连接到这些信号,并没有间谍 返回; 返回true,方法返回。 – bartek 2010-03-24 07:20:17

    +0

    使对话非模态也不能解决问题。 – bartek 2010-03-24 07:47:38

    +0

    这里的不同线程应该没有问题,因为这两个类都是UI类,并且必须位于相同的(第一个)线程中。该信号的连接类型应该默认为直接,这将立即调用它。 – 2010-03-26 14:36:14

    0

    仍然不知道发生了什么事情。我利用QEvent并通过这种方式解决了问题。

    0

    我对这个问题的第一猜测是,你没有Q_OBJECT宏在类中的一个,或可能两者。如果你在生成你的makefile后添加它,你可能需要重新运行qmake来重新生成makefile(或者你在平台上使用的任何东西),让它知道moc需要在这些类上运行。如果moc未在您的类上运行,则不会生成将信号和插槽信息添加到类中所需的代码,并且连接将失败。

    +0

    嗨,不幸的是,这两个类都有Q_OBJECT宏,事实上,这两个头文件都是由Qt Designer生成的,我试图重新编写整个项目。仍然没有成功。幸运的是发送活动作为魅力。 – bartek 2010-03-27 11:27:22