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在参数中删除了,但没有变化。我尝试用调试器调用其他插槽,发现我在这个插槽中的断点,所以没关系。我还尝试将 '50' 设置为 setValue 的参数

    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 是形式(主窗口的子窗口)......

我在 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 回答