您好我不知道为什么会出现这个错误,我看到一个可能来自宏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
答案 0 :(得分:1)
来自信号和插槽doc:
信号的签名必须与接收槽的签名匹配。 (事实上,一个插槽的签名可能比它收到的信号更短,因为它可以忽略额外的参数。)
连接时遇到两个问题:
//technocombo.com/wp-content/themes/bimder/etc/path/to/font/font.wof
因此,只需更改插槽签名即可解决您的问题:
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