QObject :: connect:QT上没有这样的插槽

时间:2018-01-21 05:18:22

标签: c++ qt

您好我不知道为什么会出现这个错误,我看到一个可能来自宏Q_OBJECT的网络,但是在其他类中这个问题没有出现。

我对ram使用相同的代码,我只称它一次,这里唯一的区别是我把它称为四次CPU的4次。

这是我的CPP

qtCPUBar::qtCPUBar(int i)
{
    _i = i;
    auto *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(showCPU(_i)));
    timer->start(1000);

    showCPU(_i);
    resize(150, 60);
}

qtCPU::qtCPU()
{
    CPUStats info;

    info.updateInfo();

    if (info.getCoreAmount() >= 4) {
        auto *CPU1 = new qtCPUBar(0);
        auto *CPU2 = new qtCPUBar(1);
        auto *CPU3 = new qtCPUBar(3);
        auto *CPU4 = new qtCPUBar(4);
        auto *vbox6 = new QVBoxLayout();
        vbox6->addWidget(CPU1);
        vbox6->addWidget(CPU2);
        vbox6->addWidget(CPU3);
        vbox6->addWidget(CPU4);

        this->setLayout(vbox6);

    }
}

void qtCPUBar::showCPU(int i)
{
    CPUStats cpu;

    cpu.updateInfo();
    auto tot = cpu._CPUInfo._Frequence;
    auto la = (cpu.getInfo(i, CPUStats::CORE_USAGE)).back();

    auto res = 100 * la / tot;
    this->setValue(static_cast<int>(res));
}

这是我的HPP

#ifndef CPP_RUSH3_CPU_HPP
#define CPP_RUSH3_CPU_HPP


#include <QProgressBar>
#include <QtWidgets>

class qtCPUBar : public QProgressBar{
Q_OBJECT
public:
    virtual ~qtCPUBar() = default;

    qtCPUBar(int i);
private slots:
    void showCPU(int i);
private:
    int _i = 0;
};


struct qtCPU : public QWidget{
public:
    virtual ~qtCPU() = default;

    qtCPU();
};

#endif

1 个答案:

答案 0 :(得分:1)

来自信号和插槽doc:

  

信号的签名必须与接收槽的签名匹配。 (事实上​​,一个插槽的签名可能比它收到的信号更短,因为它可以忽略额外的参数。)

连接时遇到两个问题:

//technocombo.com/wp-content/themes/bimder/etc/path/to/font/font.wof
  1. 您正在使用不同的签名连接信号和插槽。
  2. 连接时你给插槽一个变量,而不是仅仅放置参数类型。
  3. 因此,只需更改插槽签名即可解决您的问题:

    connect(timer, SIGNAL(timeout()), this, SLOT(showCPU(_i)));
    

    <小时/> 的修改

    正如奥尼尔所说,你也可以使用C ++ 11 lambda函数:

    //.h file
    void showCPU();
    ...
    // .cpp
    connect(timer, SIGNAL(timeout()), this, SLOT(showCPU()));
    

    警告:它使用New Signal Slot Style