5

プロジェクトで C++ と Qt を使用していますが、問題は QObject::connect 関数が信号をスロットに接続しないことです。私は次のクラスを持っています:

class AddCommentDialog : public QDialog
{
    Q_OBJECT

public:
    ...some functions 

signals:
    void snippetAdded();

private slots:
    void on_buttonEkle_clicked();

private:
    Ui::AddCommentDialog *ui;
    QString snippet;
};

私のメインウィンドウの一部:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void commentAddedSlot();
    void variableAddedSlot();
    ...

private:
    AddCommentDialog *addCommentDialog;
    ...
};

Ant 最後のダイアログ;

class AddDegiskenDialog : public QDialog
{
    Q_OBJECT

public:
    ...

signals:
    void variableAdded();

private slots:
    void on_buttonEkle_clicked();

private:
    Ui::AddDegiskenDialog *ui;
    ...
};

メイン ウィンドウ コンストラクターで、シグナルとスロットを接続します。

addCommentDialog=new AddCommentDialog();
addDegiskenDialog=new AddDegiskenDialog();

connect(addDegiskenDialog, SIGNAL(variableAdded()), this, SLOT(variableAddedSlot()));
connect(addCommentDialog, SIGNAL(snippetAdded()), this, SLOT(commentAddedSlot()));

ポイントは、私のcommentAddedSlotがそのシグナルに正常に接続されていることですが、commentAddedSlotは失敗しています。Q_OBJECT マクロがあり、x スロットがないなどの警告はありません。これに加えて、 receivers(SIGNAL(snippetAdded())) は 1 を返しますが、 receivers(SIGNAL(variableAdded())) は 0 を返し、コマンド qmake -project; を使用しました。qmake と make を使用して完全にコンパイルします。私は何が欠けていますか?

4

1 に答える 1

3

コードをざっと見ても、何が問題なのかわかりません。

しかし、ここにいくつかの瞬間があります:

  1. Mike がここで言ったように: 接続に問題がある場合は、常にコンソールで接続の失敗に関するメッセージを確認してください。Qt は接続が実行時まで意味があるかどうかを判断できないため、そこでの失敗を通知します。クラッシュすると思うかもしれませんが、コンソールでこれらのことを静かに言っているだけです。Qt では、コンソールを常に監視することが理にかなっています。Qt は、問題が発生したときに役立つあらゆる種類のエラー メッセージを出力します。
  2. 関数の結果を制御できるconnectので(公式ドキュメントより)

    信号をスロットに正常に接続すると、関数は true を返します。接続を作成できない場合、たとえば、QObject がシグナルまたはメソッドの存在を確認できない場合、またはそれらの署名に互換性がない場合は、false を返します。

  3. オブジェクト (ダイアログ) が適切に作成され、ポインタが と等しくないかどうかを確認してくださいNULL

  4. プロジェクトをクリアしてみてください(QtCreatorの「プロジェクトをクリア」コマンド)。手動ですべてを削除してもui_*moc_*. そして、それを再コンパイルします。

幸運を!そして、フィードバックをお寄せください。

于 2012-11-28T07:35:23.560 に答える