请问各位大佬,小弟有个问题,就是现在有两个类,A和B,A类是GUI层,B类是一个逻辑处理层,B类向A类发信号,A类响应并处理,现在的问题是有时候B类发送了信号但是A类不处理并且导致A类假死,小弟实在不知道该怎么办了。下面是我的代码的删减版:
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
init();
}
void Dialog::init()
{
Qt::WindowFlags flags = Qt::Dialog;
flags |= Qt::FramelessWindowHint;
setWindowFlags(flags);
ui->abbFileBtn->setEnabled(false);
ui->exportBtn->setEnabled(false);
ui->ExpInd->setEnabled(false);
ui->verifyBtn->setEnabled(false);
MasterInterFace::getInstancePtr()->init();
connect(MasterInterFace::getInstancePtr(),SIGNAL(sigInitApiFinish(bool,const QString &))
,this,SLOT(onApiInited(bool ,const QString &)));
connect(MasterInterFace::getInstancePtr(),SIGNAL(sigVerify(const QString&,const QVariant &))
,this,SLOT(onVerifyInfo(const QString & ,const QVariant &)), Qt::QueuedConnection);
}
MasterInterFace::getInstancePtr()是逻辑层的单例模式。
void Dialog::onVerifyInfo(const QString &filePath, const QVariant &var)
{
qDebug()<<"onVerifyInfo ";
signatureInfo info = var.value<signatureInfo>();
signatureInfo newInfo;
if(m_translateVerifyInfo == NULL)
{
m_translateVerifyInfo = new TranslateVerifyInfo;
}
m_translateVerifyInfo->translateVerifyInfo(info,newInfo);
if(m_fileItemMap.contains(filePath))
{
FileItemWidget *widget =m_fileItemMap[filePath];////
widget->setIconVerify(newInfo.iconUrl,newInfo.verifyRet,newInfo.errorMsg);
widget->setSignatureInfo(newInfo);
}
}
这个FileItemWidget类是继承QFrame的子类。verifyMsg是一个继承QPushButton的控件。
void MasterInterFace::startVerify(QStringList fileList)
{
m_controlPtr = new MasterControlVerify;
connect(m_controlPtr, SIGNAL(sigVerifyFinish(const QString& ,const QVariant &)),
this, SLOT(onVerify(const QString& ,const QVariant & )), Qt::DirectConnection);
// connect(m_controlPtr, SIGNAL(sigVerifyAllFinish()),this, SLOT(onVerifyAllFinished()), Qt::DirectConnection);
m_controlPtr->startWorking(fileList, "");
m_controlPtr->wait();
emit sigVerifyAllFinish();
delete m_controlPtr;
}
这个MasterInterFace类的startVerify方法会发送sigVerifyFinish信号,然后这个逻辑层再通过槽函数中的信号发送给GUI层,调用onVerifyInfo。
void MasterInterFace::onVerify(const QString &filePath, const QVariant &var)
{
emit sigVerify(filePath, var);
qDebug()<<"emit sigVerify(filePath, var);";
}
现在的问题是这个逻辑层发送的信号GUI层有时接收不到,造成假死,还有,GUI的connect的第五个参数填Qt::DirectConnection的话会报图片上的错误,小弟是真的没办法了,不仅菜的要死而且总被骂,希望各位大佬帮我一手,感谢!
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
init();
}
void Dialog::init()
{
Qt::WindowFlags flags = Qt::Dialog;
flags |= Qt::FramelessWindowHint;
setWindowFlags(flags);
ui->abbFileBtn->setEnabled(false);
ui->exportBtn->setEnabled(false);
ui->ExpInd->setEnabled(false);
ui->verifyBtn->setEnabled(false);
MasterInterFace::getInstancePtr()->init();
connect(MasterInterFace::getInstancePtr(),SIGNAL(sigInitApiFinish(bool,const QString &))
,this,SLOT(onApiInited(bool ,const QString &)));
connect(MasterInterFace::getInstancePtr(),SIGNAL(sigVerify(const QString&,const QVariant &))
,this,SLOT(onVerifyInfo(const QString & ,const QVariant &)), Qt::QueuedConnection);
}
MasterInterFace::getInstancePtr()是逻辑层的单例模式。
void Dialog::onVerifyInfo(const QString &filePath, const QVariant &var)
{
qDebug()<<"onVerifyInfo ";
signatureInfo info = var.value<signatureInfo>();
signatureInfo newInfo;
if(m_translateVerifyInfo == NULL)
{
m_translateVerifyInfo = new TranslateVerifyInfo;
}
m_translateVerifyInfo->translateVerifyInfo(info,newInfo);
if(m_fileItemMap.contains(filePath))
{
FileItemWidget *widget =m_fileItemMap[filePath];////
widget->setIconVerify(newInfo.iconUrl,newInfo.verifyRet,newInfo.errorMsg);
widget->setSignatureInfo(newInfo);
}
}
这个FileItemWidget类是继承QFrame的子类。verifyMsg是一个继承QPushButton的控件。
void MasterInterFace::startVerify(QStringList fileList)
{
m_controlPtr = new MasterControlVerify;
connect(m_controlPtr, SIGNAL(sigVerifyFinish(const QString& ,const QVariant &)),
this, SLOT(onVerify(const QString& ,const QVariant & )), Qt::DirectConnection);
// connect(m_controlPtr, SIGNAL(sigVerifyAllFinish()),this, SLOT(onVerifyAllFinished()), Qt::DirectConnection);
m_controlPtr->startWorking(fileList, "");
m_controlPtr->wait();
emit sigVerifyAllFinish();
delete m_controlPtr;
}
这个MasterInterFace类的startVerify方法会发送sigVerifyFinish信号,然后这个逻辑层再通过槽函数中的信号发送给GUI层,调用onVerifyInfo。
void MasterInterFace::onVerify(const QString &filePath, const QVariant &var)
{
emit sigVerify(filePath, var);
qDebug()<<"emit sigVerify(filePath, var);";
}
现在的问题是这个逻辑层发送的信号GUI层有时接收不到,造成假死,还有,GUI的connect的第五个参数填Qt::DirectConnection的话会报图片上的错误,小弟是真的没办法了,不仅菜的要死而且总被骂,希望各位大佬帮我一手,感谢!