无法连接QMainWindow和QDialog

时间:2010-03-23 15:06:45

标签: user-interface qt4

我有一个显示QDialog的QMainWindow:

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

我的QMainWindow类有一个信号:

signals:
void PenOn( QPoint p );

QDialog有一个插槽:

public slots:
void on_PenON( QPoint p );

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

  1. 实例化QDialog后
  2. 
       void MainWindow::on_actionC_triggered()
       {
         appState = CALIBR;
    
         CalibrationDialog d(this);
         connect( this, SIGNAL(PenOn(QPoint)), &d,SLOT(on_PenOn(QPoint)) );
         d.exec();
       }
    
    1. 在QDialog构造函数中
    2. 
          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信号。

      我做错了什么?

3 个答案:

答案 0 :(得分:0)

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

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()循环结束。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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