Qt C++:静态断言失败:信号和插槽参数不兼容
Qt C++: static assertion failed: Signal and slot arguments are not compatible
当用户单击按钮时,我正在尝试在工作线程中启动倒数计时器。计时器开始倒计时的值取决于我的 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
(
我发布了这个答案,因为我遇到了同样的问题,而接受的答案并没有解决我的问题,所以如果接受的答案对你没有帮助,请尝试这个答案
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt moveToThread,带有参数的信号/插槽
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- QMetaObject::invokeMethod的插槽参数
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 在插槽中传递多个参数
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 插槽(指向方法成员的指针)作为 SIP 中方法的参数
- Qt - 使用λ函数修改先前连接信号的插槽参数
- QTIMER,参数化插槽
- Qt信号和插槽:是复制的参考参数
- 将多个参数传递给插槽
- 插槽比信号提供的参数少,如何?-QT
- Qt 5将带有参数的插槽分配给QPushButton
- 将自定义参数传递到Qt/C++中的插槽
- 在 qt 中传递带有信号和插槽的参数
- Qt插槽参数已损坏
- Qt:从一个对象发出相同的信号,但参数不同;插槽通过接收的参数进行区分