即使在设置了objectName之后,Qt也无法按名称插入

时间:2015-07-08 16:22:22

标签: c++ qt

当我尝试使用Qt自动信号使用Qt元对象的能力进行插槽连接时,会发生这种情况。我尝试创建一个QTimer对象,并更改其名称,但插槽无法匹配信号,我不知道为什么。这是我的代码:

mytimer.h:

#ifndef MYTIMER_H
#define MYTIMER_H

#include <QMainWindow>
#include <QTimer>

namespace Ui {
class MyTimer;
}

class MyTimer : public QMainWindow
{
    Q_OBJECT

public:
    explicit MyTimer(QWidget *parent = 0);
    ~MyTimer();

private:
    Ui::MyTimer *ui;
    QTimer *timer;
private slots:
    void on_timerOne_timeout();
};

#endif // MYTIMER_H

mytimer.cpp:

#include "mytimer.h"
#include "ui_mytimer.h"
#include <QTimer>
#include <QDebug>

MyTimer::MyTimer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MyTimer)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    timer->setObjectName("timerOne");
    // connect(timer, &QTimer::timeout, this, &MyTimer::MySlot);
    timer->start(1000);
}

MyTimer::~MyTimer()
{
    delete ui;
}

void MyTimer::on_timerOne_timeout()
{
    qDebug() << "Timer running...";
}

我将计时器的ObjectName更改为timerOne后,signal-slot-auto-connection:

void MyTimer::on_timerOne_timeout() 

无法正常运行。

使用Qt 5.5.0

1 个答案:

答案 0 :(得分:1)

根据您的评论,Ui::MyTimer::setupUi会调用QMetaObject::connectSlotsByName。但是在构造setupUi之前,您正在调用QTimer,因此在调用timerOne时没有名为setupUi的子对象,因此自动连接槽名称模式{{1没有匹配任何插槽。

在构建计时器并给出名称后,将呼叫移至on_<object name>_<signal name>

setupUi