我的代码中有这一行:
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(我使用的)是setValue
是public 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中工作
答案 0 :(得分: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