我有一个显示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)) );
}
这些都不起作用:(。 我正在从另一个线程激活的MainWindow插槽中发出PenOn信号。
我做错了什么?
答案 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
未在您的类上运行,则它不会生成将信号和插槽信息添加到类所需的代码,并且连接将失败。