具有自定义插槽功能的连接功能在 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&)
.
我确定我的问题很简单,但我就是无法调试!!
我正在尝试将一个 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&)
.