1

コードに次の行があります。

    QObject::connect(scanning_worker, SIGNAL(update_progress_bar(const int)), ui.progress_bar, SLOT(setValue(const int)));

実行時に次のエラーが発生します。

    No such slot QProgressBar::setValue(const int)

なぜアイデアはありますか?ドキュメントQT 4.8(私が使用しています)では、それsetValuepublic slot...

私はこれを試しました:私は議論のconst前に削除しましたが、変更はありません。intデバッガーで他のスロットを呼び出してみたところ、このスロットのブレークポイントが見つかったので、問題ありませんでした。setValue の引数として「50」も設定しようとしました

    QObject::connect(scanning_worker, SIGNAL(update_progress_bar(const int)), ui.progress_bar, SLOT(setValue(50)));

それでも同じエラー...

私のクラス:

    class Scanning_worker : public QObject{
        Q_OBJECT
    private:
        int shots_count;
    public:
        Scanning_worker(const int shots) : shots_count(shots){}
        ~Scanning_worker(){}
    public slots:
        void do_work();
    signals:
        void error(const int err_num);
        void update_progress_bar(int value);
        void finished();
    };

そして、ui.progress_bar はフォーム (mainwindow の子) です...

私はVisual Studio 2010、W7 prof、QT 4.8で働いています

4

1 に答える 1

6

スロットはint: を必要としておりconst int、それを指定しているため、エラーが発生します。に変更SLOT(setValue(const int))するSLOT(setValue(int))だけでは不十分です。シグナルを変更する必要があるためint、'const int' の代わりに引数を指定します。

QObject::connect(scanning_worker, SIGNAL(update_progress_bar(int)), ui.progress_bar, SLOT(setValue(int)));

基本的に、シグナルは常にスロットとまったく同じ引数を持つ必要があります。そうしないと機能しません。信号をスロットに接続する別の方法もあり、何か間違ったことをするとコンパイル時にエラーが発生します。次のようなクラスがあるとします。

class Foo : public QObject {
    Q_OBJECT
public slots:
    void fooSlot(){ }
signals:
    void fooSignal(){ }
};
Foo *a = new Foo();

qt5 を使用する場合は、次のように接続する代わりに:

connect( a, SIGNAL(fooSignal()), a, SLOT(fooSlot()) );

次のように接続することもできます。

connect(  a, &Foo::fooSignal, a, &Foo::fooSlot );

この場合、エラーが発生すると、コンパイル中に表示されます。また、括弧が少ないため、読みやすくなっています:P

于 2013-09-16T13:38:40.000 に答える