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

6
我正在尝试在工作线程中启动倒计时器,当用户单击PushButton时。计时器开始倒计时的值取决于GUI中所选的半径按钮。我使用SignalMapper将计时器的起始值作为参数传递。但是,当我尝试编译我的代码时,会出现以下错误:
 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);
};

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

谢谢


请展示MainWindow.h文件。 - eyllanesc
我还注意到它缺少命令:ui->setupUi(this);,这是打字错误吗? - eyllanesc
2
注意:该类中已经重载了 Signal mapped。要使用函数指针语法连接到它,您必须在 static cast 中指定信号类型,就像这个例子所示:connect(signalMapper, static_cast(&QSignalMapper::mapped), [=](int i){ /* ... */ }); - ikleschenkov
"SLOT(&workerTimer::countDown(int))" 看起来有点奇怪。难道不应该只是 "SLOT(countDown(int))" 吗? - G.M.
2个回答

4
除了IIBeldus的答案之外,出现此错误的另一个原因是您使用了QT的connect()函数的新语法,即:
connect(
    sender, &Sender::valueChanged,
    receiver, &Receiver::updateValue
);

如果信号(valueChanged)参数与槽(updateValue)参数不同,这将使编译器尝试对信号和槽参数进行隐式转换,并且您有两种可能性:
1. 编译器将尝试进行自动转换(隐式转换),并且转换成功。
2. 编译器将尝试进行自动转换(隐式转换),但转换失败了。
QT文档中写到:

如果存在隐式转换(例如从QStringQVariant),则可以自动转换类型的可能性。

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


4

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

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

您混淆了两种连接方式,使得整个语句无意义。请参考链接http://doc.qt.io/qt-5/signalsandslots.html

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接