传递变量时QTimer不会启动

时间:2017-06-08 15:33:35

标签: c++ qt qtimer

我有一个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()

1 个答案:

答案 0 :(得分:1)

connect(timer, SIGNAL(timeout()), this, SLOT(print(val)));

Qt信号/插槽连接无法正常工作。 SIGNAL()和SLOT()宏中的文本必须是信号/槽方法的签名,逐字记录;你不能把变量或其他非方法签名文本放在那里。

如果在程序运行时查看程序的标准输出,您将看到connect()打印出的错误消息,告诉您它找不到任何名为print(val)的插槽方法。

如果你想为你的插槽提供一个单独的值,你可以使val成为你的类的成员变量,并让print()查看成员变量而不是参数,或者你可以使用中间插槽,像这样:

public slots:
   void print(int val); 
   void print42() {print(val);}

...然后将信号连接到SLOT(print42())。