我确定我的问题很简单,但我无法调试!
我正在尝试将spinBox小部件连接到自定义函数,该函数在Qt上设置我的QSerialPort实例的com端口。
我的主窗口构造器,我尝试将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的值时,我看不到调试控制台上的任何内容。这是Synthax问题吗?我知道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&)
。