从插槽

时间:2019-05-24 06:02:48

标签: c++ qt serial-port hardware

我正在QT中编写GUI来控制USB继电器。我写了一个具有打开/关闭成员功能的中继类。还编写了一个自定义窗口小部件,该窗口小部件具有用于控制的单选按钮,一个继电器指针以及一个switchStatus()插槽,在该插槽中调用了继电器打开/关闭功能。主窗口具有中继成员。当我从mainwindow构造函数调用ui-> widget-> switchStatus()时,一切正常,可以很好地打开和关闭继电器。但是,如果我将单选按钮信号连接到switchStatus(),则每当我单击单选按钮时,程序都会崩溃。它在serialPort-> write行崩溃。但这与写无关,它首先遇到的与serialPort指针相关的任何代码都将导致崩溃。甚至我都想获取端口名称或端口地址。

myWidget::myWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::Form)
{    status = 0;

    m_ui->setupUi(this);
    m_ui->statusIndicator->status = &status; // status in ui pointing to null before this

    m_ui->turnOffButton->setChecked(true);
    connect(m_ui->turnOnButton, SIGNAL(clicked(bool)), this, SLOT(switchStatus())); 
//crashes when click ratioButton, 
//compare to last line in the mainwindow construtor
    connect(m_ui->turnOffButton, SIGNAL(clicked(bool)), this, SLOT(switchStatus()));
}

void myWidget::switchStatus()
{
    qDebug() << "swithcing";
    if(status)
    {
        setStatus(false);
    }
    else
    {
        setStatus(true);
    }
    m_relay->switchStatus();

}


void relay::switchStatus()
{   if(status) turnOff();
    else turnOn();
}

bool relay::turnOn(){
    qDebug() << writeDataOn; // test if string is correct
    qDebug() << serialPort; // crashes whenever serialPort address is called
    const qint64 bytesWritten = serialPort->write(writeDataOn);
}


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
    qDebug() << infos[0].description();
    QSerialPort serialPort;
    serialPort.setPortName(infos[0].portName());
    serialPort.setBaudRate(QSerialPort::Baud9600);
    if (!serialPort.open(QIODevice::ReadWrite)) {
        qDebug() << QObject::tr("Failed to open port %1, error: %2").arg(serialPort.portName()).arg(serialPort.error()) ;
    }
    ui->setupUi(this);
    for(int i=0;i<4;i++)
    {
        relays[i].setRelayNumber(i);
        relays[i].setPort(&serialPort);
        relays[i].setStatus(relays[i].getRealStatus());
    }


    ui->widget->m_relay = relays;

    qDebug() << ui->widget->m_relay;
    qDebug() << ui->widget->m_relay->getPort();

    ui->widget->switchStatus(); // this line runs well
}

1 个答案:

答案 0 :(得分:0)

使您的串行端口成为MainWindow类的成员。目前,它在您的构造函数中是本地的,因此在构造函数完成时会被释放,从而导致崩溃。如果已声明“ serialPort”成员,则可以通过在构造函数内部将其重新声明为局部作用域变量来隐藏它。