1

ワーカースレッドがそれを実行し、GUIスレッドをコールバックしてダイアログボックスを閉じるためのシグナルを発行するという、少し奇妙な状況があります。誰かがこれが機能する理由を説明できますか?

WorkerThread:

[Header]
signals:
    void writeComplete(void);

[Source]
void startWorkerThread()
{
    // do some stuff in boost::thread
    emit writeComplete();
}

MainWindowサブクラス:

burnDialog = new QProgressDialog("Writing to disc", "", 0, 0);
burnDialog ->setCancelButton(0);
QWidget::connect( discHandler.get(), SIGNAL(writeComplete()), burnDialog, SLOT(close()) );
QWidget::connect( discHandler.get(), SIGNAL(writeComplete()), this, SLOT(close()) );
burnDialog->open();
discHandler->startWorkerThread();

しかし、これはしません:

MainWindowサブクラス:[ヘッダー]パブリックスロット:void closeWithDialog(void);

[Source]
burnDialog = new QProgressDialog("Writing to disc", "", 0, 0);
QWidget::connect( discHandler.get(), SIGNAL(writeComplete()), this, SLOT(closeWithDialog()) );
burnDialog ->setCancelButton(0);
burnDialog->open();
discHandler->startWorkerThread();

void closeWithDialog()
{
    burnDialog->close();
    close();
}
4

2 に答える 2

3

Q_OBJECTのような感じ...私はヘッダーファイルを入れませんでした。サブクラスが継承したという事実はQMainWindowQ_OBJECTインターフェースも暗黙的に継承されると思いました。しかし、そうではありませんでした...とにかくみんな助けてくれてありがとう!

于 2012-06-18T11:53:40.850 に答える
0

動作しない場合の障害のある行は次のとおりです。

QWidget::connect( discHandler.get(), SIGNAL(writeComplete()), burnDialog,
                  SLOT(closeWithDialog()) );

インスタンスにを割り当てているということは、メソッドがクラスでなければならないことを意味SLOTします。そのような方法はありません。次のメッセージがないかコンソールを確認する必要があります。burnDialogcloseWithDialog()QProgressDialogQProgressDialog

Object::connect: No such slot QProgressDialog::closeWithDialog()

上記の障害のある行を次のように変更します。

QWidget::connect( discHandler.get(), SIGNAL(writeComplete()), this,
                  SLOT(closeWithDialog()) );
于 2012-06-15T10:10:48.187 に答える