Невозможно соединить QMainWindow и QDialog - PullRequest
2 голосов
/ 23 марта 2010

У меня есть 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();
   }
  1. В конструкторе 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, активированного другим потоком.

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 24 марта 2010

Все еще не знает, что происходит. Я использовал QEvent и решил проблему таким образом.

0 голосов
/ 26 марта 2010

Мое первое предположение о проблеме заключается в том, что у вас нет макроса Q_OBJECT в одном из ваших классов или, возможно, в обоих. Если вы это сделаете, но добавили его после того, как сгенерировали свой make-файл, вам может потребоваться перезапустить qmake, чтобы сгенерировать make-файл (или то, что вы используете на своей платформе), чтобы дать ему понять, что moc необходимо запустить на этих классы. Если moc не выполняется над вашими классами, он не генерирует код, необходимый для добавления информации о сигнале и слоте в класс, и соединения не будут установлены.

0 голосов
/ 24 марта 2010

Я думаю, вам нужно использовать прямое блокирующее соединение, хотя помните, что слот будет выполняться в потоке 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 () завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...