无法连接QMainWindow和QDialog

我有一个显示QDialog的QMainWindow:

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

我的QMainWindow类有一个信号:

signals:
void PenOn( QPoint p );

而QDialog有一个插槽:

public slots:
void on_PenON( QPoint p );

我尝试通过两种方式将PenOn事件连接到on_PenOn:

  • 实例化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)) );
        }
    

    这些都没有工作:(。我发出PenOn信号从另一个线程激活的MainWindow插槽。

    我究竟做错了什么?


    我认为你需要使用阻塞式直接连接,但要注意该插槽将在MainWindow的线程中执行:

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

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

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


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


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

    链接地址: http://www.djcxy.com/p/39269.html

    上一篇: Cannot connect QMainWindow and QDialog

    下一篇: Why does QEvent::ShortcutOverride event occur?