При нажатии на кнопки на тулбаре выполняется слот
void MainWindow::setConnection()
в котором создается объект потока thread.
C++ (Qt)
void MainWindow::setConnection()
{
qDebug()<<__FUNCTION__;
if(thread == NULL){
thread = new Thread(&port_settings);
connect(thread,SIGNAL(errorConnect(bool )),this,SLOT(errorConnect(bool))); //не работает
thread->start();
}
}
void MainWindow::errorConnect(bool err)
{
qDebug()<<__FUNCTION__;
qDebug()<<err;
if(!err){
actConnect->setDisabled(true);
actDisConnect->setEnabled(true);
actSettings->setDisabled(true);
timerShow->start(500);
leStatusPort->setText("Подключен");
leNamePort->setText(port_settings.namePort);
leBaudPort->setText(QString("%1").arg(port_settings.baudRate));
}
else{
thread->quit();
thread->wait();
delete thread;
thread = NULL;
leStatusPort->setText("Отключен");
leNamePort->setText(port_settings.namePort);
leBaudPort->setText(QString("%1").arg(port_settings.baudRate));
}
}
В нитке создается экземпляр класса TransportLevel, в котором создается экземпляр класса ChannelLevel.
C++ (Qt)
Thread::Thread(Port_Settings *port_settings,QObject *parent) :
QThread(parent),
settings(port_settings)
{
moveToThread(this);
}
Thread::~Thread()
{
}
void Thread::run()
{
TransportLevel transport(settings);
connect(&transport,SIGNAL(errorConnect(bool )),this,SLOT(sl_errorConnect(bool ))); //не работает
exec();
}
void Thread::sl_errorConnect(bool err)
{
qDebug()<<"Thread "<<__FUNCTION__;
emit errorConnect(err);
}
C++ (Qt)
TransportLevel::TransportLevel(Port_Settings *port_settings, QObject *parent) :
QObject(parent),
settings(port_settings)
{
channel = new ChannelLevel(settings,this);
connect(channel,SIGNAL(errorConnect(bool )),this,SLOT(sl_errorConnect(bool )));
qDebug()<<"transport channel level = "<<this->thread();
}
void TransportLevel::sl_errorConnect(bool err){
qDebug()<<"TransportLevel"<<__FUNCTION__;
emit errorConnect(err);
}
//========================================================================================
ChannelLevel::ChannelLevel(Port_Settings *port_settings,QObject *parent) :
QObject(parent),
settings(port_settings)
{
err = true;
serialPort = new QSerialPort(this);
openPort();
qDebug()<<"thread channel level = "<<this->thread();
}
void ChannelLevel::openPort()
{
qDebug()<<"settings->namePort = "<<settings->namePort;
if(serialPort){
serialPort->setPortName(settings->namePort);
if(serialPort->open(QIODevice::ReadWrite)){
if(serialPort->setBaudRate(settings->baudRate)
&&(serialPort->setDataBits(settings->dataBits))
&&(serialPort->setParity(settings->parity))
&&(serialPort->setStopBits(settings->stopBits))
&&(serialPort->setFlowControl(settings->flowControl)))
{
if(serialPort->isOpen()){
//QByteArray ba;
//ba.append(port_settings.namePort + " открыт");
//serialPort->write(ba);
setStrStatus(settings->namePort + " ???\n");
//statusString.clear();
//statusString = settings->namePort + " ???\n";
err = false;
qDebug()<<err;
emit errorConnect(err);
return;
}else{
setStrStatus(serialPort->errorString());
//statusString.clear();
//statusString = serialPort->errorString();
err = true;
emit errorConnect(err);
return;
}
}else{
serialPort->close();
setStrStatus(serialPort->errorString());
//statusString.clear();
//statusString= serialPort->errorString();
err = true;
emit errorConnect(err);
return;
}
}
}
//statusString.clear();
//statusString = settings->namePort;
setStrStatus(serialPort->errorString());
emit errorConnect(true);
return;
}
И к сожалению сигнало-слотовое соединение
connect(&transport,SIGNAL(errorConnect(bool )),this,SLOT(sl_errorConnect(bool )));
в Thread не работает. Не могли бы пояснить почему так?