具有自定义插槽功能的连接功能在 Qt 上不起作用

Connect function with custom slot function does not work on Qt

我确定我的问题很简单,但我就是无法调试!!

我正在尝试将一个 spinBox 小部件连接到一个自定义函数,该函数在 Qt 上设置我的 QSerialPort 实例的 com 端口。

我的主要 Window 构造函数,我尝试将我的 com_spinBox 连接到名为 setComPort() 的自定义函数:

QSerialPort *serial;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);  // Here by default. Takes a pointer to mainwindow as argument
    serial = new QSerialPort(this); // this (mainwindow) is parent

    connect(ui->com_spinBox, SIGNAL(valueChanged(QString)),
            this, SLOT(MainWindow::setComPort()));

    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    qDebug() << "is " << serial->open(QSerialPort::ReadOnly);
    qDebug() << "err " << serial->error();

}

我也在 MainWindow.cpp 中定义了我的函数(并在 .h 中声明):

void MainWindow::setComPort()
{
    qDebug() << "fu";
}

当我更改 spinBox 的值时,我在调试控制台上没有看到任何内容。这是一个语法问题吗?我知道 qDebug 可以正常工作,因为我可以在我的构造函数中打印其他内容没问题。 谢谢!

您混合使用了 QObject::connect 的新旧语法,并以错误的方式使用了函数指针。这是错误的:SLOT(MainWindow::setComPort().

如果你想故意使用旧语法..不要将函数指针与SLOT一起使用,只需使用那个槽签名;你的 connect 应该是这样的:

connect(ui->spinBox, SIGNAL(valueChanged(const QString&)),
                this, SLOT(setComPort()));

另一方面,可以使用带有函数指针的新语法。您只需要使用 QSpinBox 的重载信号签名,如此处 https://doc.qt.io/qt-5/qspinbox.html#valueChanged:

所述
connect(ui->spinBox, QOverload<const QString&>::of(&QSpinBox::valueChanged) ,
                this , &MainWindow::setComPort);

另请注意,虽然 Qt connect() 允许插槽没有参数,并且基于猜测您的意图..您可能想要更改插槽签名以接收串行端口号.. MainWindow::setComPort(const QString&).