传递变量时 QTimer 不会启动
QTimer won't start when passing a variable
我有一个每秒启动一个函数的 QTimer 对象。如果我执行以下操作,计时器将正确运行
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
// Set a Qtimer to update the OSD display every 1 second
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(print()));
timer->start(1000);
}
void MainWindow::print()
{
printf("hello world\n");
}
但是我想传递一个变量给print()。但是当我这样做时,我从来没有看到我的打印语句。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
// Set a Qtimer to update the OSD display every 1 second
QTimer *timer = new QTimer(this);
int val = 42;
// Now pass val to print()
connect(timer, SIGNAL(timeout()), this, SLOT(print(val)));
timer->start(1000);
}
void MainWindow::print(int val)
{
// I never see my print statement
printf("hello world, val=%d\n", val);
}
header.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void print(int val);
为什么这不起作用?我该怎么做才能使用 QTimer 将变量传递给 print()?
connect(timer, SIGNAL(timeout()), this, SLOT(print(val)));
Qt signal/slot 连接不是那样工作的。 SIGNAL() 和 SLOT() 宏中的文本必须是 signal/slot 方法的签名,一字不差;你不能在那里放置变量或其他非方法签名文本。
如果您在程序运行时查看它的标准输出,您会看到一条由 connect() 打印的错误消息,告诉您它找不到任何名为 print(val) 的槽方法。
如果你想为你的插槽提供一个单独的值,你可以使 val 成为你的 class 的成员变量,并让 print() 查看成员变量而不是参数,或者你可以使用中间插槽,像这样:
public slots:
void print(int val);
void print42() {print(val);}
... 然后将信号连接到 SLOT(print42())。
我有一个每秒启动一个函数的 QTimer 对象。如果我执行以下操作,计时器将正确运行
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
// Set a Qtimer to update the OSD display every 1 second
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(print()));
timer->start(1000);
}
void MainWindow::print()
{
printf("hello world\n");
}
但是我想传递一个变量给print()。但是当我这样做时,我从来没有看到我的打印语句。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
// Set a Qtimer to update the OSD display every 1 second
QTimer *timer = new QTimer(this);
int val = 42;
// Now pass val to print()
connect(timer, SIGNAL(timeout()), this, SLOT(print(val)));
timer->start(1000);
}
void MainWindow::print(int val)
{
// I never see my print statement
printf("hello world, val=%d\n", val);
}
header.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void print(int val);
为什么这不起作用?我该怎么做才能使用 QTimer 将变量传递给 print()?
connect(timer, SIGNAL(timeout()), this, SLOT(print(val)));
Qt signal/slot 连接不是那样工作的。 SIGNAL() 和 SLOT() 宏中的文本必须是 signal/slot 方法的签名,一字不差;你不能在那里放置变量或其他非方法签名文本。
如果您在程序运行时查看它的标准输出,您会看到一条由 connect() 打印的错误消息,告诉您它找不到任何名为 print(val) 的槽方法。
如果你想为你的插槽提供一个单独的值,你可以使 val 成为你的 class 的成员变量,并让 print() 查看成员变量而不是参数,或者你可以使用中间插槽,像这样:
public slots:
void print(int val);
void print42() {print(val);}
... 然后将信号连接到 SLOT(print42())。