10

Qt v4.8.0、VC2010コンパイラ

私はQMainWindowベースクラスを持っていて、それに関連する信号を送信しようとしていますQUuid

ただし、実行するたびにエラーが発生します。

Object::connect: No such slot MainWindow::on_comp_connected(QUuid) in ..\..\src\mainwindow.cpp:143
Object::connect:  (receiver name: 'MainWindow')

スロットが確かに存在するので、それは私を取るに足らないものにしています(それはmoc_にあります)

class MainWindow : public QMainWindow
{
Q_OBJECT

// SNIP private typedefs

public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();
// SNIP public methods

signals:
   void testSendQuuid(const QUuid &qcid);

public slots:
   void on_comp_connected(const QUuid &qcid);

private:
// SNIP private parts

QOpenAcnController *acnInt;  // This is where the signal comes from

};

コンストラクターの最後MainWindow(言及されている143行目)には、次のものがあります。

connect(acnInt, SIGNAL(callback_comp_connected(QUuid)),
        this, SLOT(on_comp_connected(QUuid)));

スロットがmoc_mainwindow.cppに確実に存在することを考えると(私がチェックしたところ、それはスロット#1です)、一体何が接続の発生を止めているのでしょうか?

信号をスロットに接続しようとすると、testSendQuuid(QUuid)そのような信号もスロットも取得しません。

Qtが間違いなくそこにあるスロットの存在を否定している理由を私は一生理解できません!

4

4 に答える 4

9

メインウィンドウクラスにQ_OBJECTマクロを追加することで問題を解決しました。

于 2016-10-12T07:38:15.470 に答える
6

それがあなたの中にあるかどうかを確認moc_mainwindow.cppしてくださいBuild Path。または、他のmoc_window.cppファイルを使用しています。たとえば、QtCreatorでは、ソースを新しいビルドディレクトリにビルドします。また、別の場所でソースを開こうとすると、古いmoc_cppファイルが使用されます。

私が言おうとしているのは、チェックしたmocファイルにそれらのスロット定義が含まれている可能性があるということですが、コンパイラーは以前に作成された他のmocファイルを使用している可能性があります。

于 2012-05-18T17:17:21.423 に答える
1

私はこのような問題を解決しました

private slots:
    void on_comp_connected(const QUuid &qcid);

その後、コンストラクターで

connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(on_comp_connected(QUuid)));
于 2020-08-27T08:38:46.370 に答える
0

あなたが必要です

connect(acnInt, SIGNAL(callback_comp_connected(QUuid)),         this, SLOT(on_comp_connected(const QUuid&))); 

値の受け渡しは、const参照の受け渡しと一致してはなりません。

しかし、私はそれを試しました、そしてそれはします。WindowsでQt4.7.4を使用して、QtCreator2.4.1で最小限のプロジェクトを作成しました。メインウィンドウに単一のラベルを追加し、MainWindow.cppを次のように変更しました

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(
      this, SIGNAL(testSendQuuid(QUuid)),
      this, SLOT(on_comp_connected(QUuid))
    );
    QUuid x = QUuid::createUuid();
    emit testSendQuuid(x);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_comp_connected(const QUuid &qcid)
{
    ui->label->setText(qcid.toString());
}

そして、メインウィンドウにuuidが表示されます。

また、接続の2つのQUuid引数をconst QUuid&に変更してみましたが、これも機能しました。

したがって、問題はビルドに関連している必要があります。

于 2012-05-18T17:22:05.057 に答える