Qt C++:静态断言失败:信号和插槽参数不兼容

Qt C++: static assertion failed: Signal and slot arguments are not compatible

本文关键字:插槽 参数 信号 不兼容 失败 C++ 静态 断言 Qt      更新时间:2023-10-16

当用户单击按钮时,我正在尝试在工作线程中启动倒数计时器。计时器开始倒计时的值取决于我的 GUI 中选择的半径按钮。

我使用信号映射器将计时器的起始值作为参数传递。但是,在尝试编译代码时出现此错误:

static assertion failed: Signal and slot arguments are not compatible

我的代码:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
connect(ui->btnTakeSnap, SIGNAL(clicked()), this, SLOT(startTimerWorker()) );
}
void MainWindow::startTimerWorker()
{
myThread = new QThread(this);
workerObj = new workerTimer();
QSignalMapper* signalMapper = new QSignalMapper (this) ;
connect(myThread, &QThread::started, signalMapper, SLOT(map()) );
if(ui->rdBtntimer1s->isChecked())
{signalMapper -> setMapping (myThread, 1000) ; }
if(ui->rdBtntimer3s->isChecked())
{signalMapper -> setMapping (myThread, 3000) ;  }
if(ui->rdBtntimer5s->isChecked())
{signalMapper -> setMapping (myThread, 5000) ;}
connect(signalMapper, SIGNAL(mapped(int)), workerObj, SLOT(&workerTimer::countDown(int)));
workerObj->moveToThread(myThread);
myThread->start();
}

class workerTimer : public QObject
{
Q_OBJECT
public:
explicit workerTimer(QObject *parent = nullptr);
signals:
public slots:
void countDown(int selectedTimer);
};

有人可以解释我可能做错了什么吗?

谢谢

connect(myThread, &QThread::started, signalMapper, SLOT(map()) );

connect(signalMapper, SIGNAL(mapped(int)), workerObj, SLOT(&workerTimer::countDown(int)));

您正在混合 2 种连接,使整个语句毫无意义。 请参阅 http://doc.qt.io/qt-5/signalsandslots.html

connect(myThread, SIGNAL(started()), signalMapper, SLOT(map()) );

connect(signalMapper, SIGNAL(mapped(int)), workerObj, SLOT(countDown(int)));

除了 IIBeldus 的答案之外,发生此错误的另一个原因是您使用了 QTconnect()函数的新语法:

connect(
sender, &Sender::valueChanged,
receiver, &Receiver::updateValue
);

并且信号(valueChanged(参数与插槽(updateValue(参数不同,这将使编译器尝试信号和时隙参数的隐式转换,您有以下两种可能性之一:
1.编译器将尝试进行自动转换(隐式转换(,并且转换成功。
2. 编译器将尝试进行自动转换(隐式转换(,但转换不成功。
来自 QT 文档:

如果存在隐式,则可以自动强制转换类型 转换(例如从QString转换为QVariant(

我发布了这个答案,因为我遇到了同样的问题,而接受的答案并没有解决我的问题,所以如果接受的答案对你没有帮助,请尝试这个答案