无法连接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:
void MainWindow::on_actionC_triggered()
{
appState = CALIBR;
CalibrationDialog d(this);
connect( this, SIGNAL(PenOn(QPoint)), &d,SLOT(on_PenOn(QPoint)) );
d.exec();
}
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
没有运行在类上,它不会生成将信号和插槽信息添加到类中所需的代码,并且连接将失败。