Функция подключения с пользовательской функцией слота не работает на Qt - PullRequest
0 голосов
/ 04 апреля 2020

Я уверен, что моя проблема очень проста, но я просто не могу ее отладить !!

Я пытаюсь подключить виджет spinBox к пользовательской функции, которая устанавливает com-порт моего экземпляра QSerialPort на Qt .

Мой конструктор главного окна, я пытаюсь подключить свой 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 работает, поскольку я могу напечатать другие вещи в моем конструкторе без проблем. Спасибо!

1 Ответ

2 голосов
/ 04 апреля 2020

Вы смешиваете старый и новый синтаксис 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&).

...